« Découvrir Scilab/Gestion des fichiers » : différence entre les versions

Contenu supprimé Contenu ajouté
→‎Exploitation de fichiers texte : réorganisaiton, strsplit
Ligne 242 :
 
Le format texte (ASCII ou Unicode), du fait de son caractère universel, sert fréquemment de format d'échange entre logiciels. Il est donc intéressant de se focaliser sur les spécificités de ce format. Les fonctions <code>read()</code> et <code>csvRead()</code> sont simples d'utilisation, mais ne sont plus applicables pour les fichiers très grands.
 
==== Lire une matrice de nombres ====
 
La commande <code>fscanfMat</code> permet de lire directement une matrice dans un fichier texte (ASCII ou UTF-8). Dans sa syntaxe de base
<source lang="scilab">
M = fscanfMat('nomfichier');
</source>
la fonction crée une matrice de nombrenombres M à partir du fichier texte <code>nomfichier</code>, en éliminant l'en-tête (les premières lignes qui contiennent des caractères non numériques). On peut lui demander de metremettre le texte de l'en-tête dans une variable :
<source lang="scilab">
[M, entete] = fscanfMat('nomfichier');
</source>
Il est possible d'indiquer le format des données :
<source lang="scilab">
M = fscanfMat('nomfichier', 'format');
</source>
ou ''format'' est une chaîne de caractère qui peut être de la forme <code>%''type''</code>, par exemple :
* <code>%e</code> : réel en notation exponentielle ;
* <code>%f</code> : réel en notation décimale (point flottant) ;
* <code>%g</code> : réel en notation exponentielle si l'exposant est inférieur à -4, notation décimale sinon ;
* <code>%lg</code> : réel long (double précision) ;
* <code>%d</code> ou <code>%i</code> : nombre entier ;
* <code>%x</code> : entier hexadécimal.
La chaîne peut également contenir la largeur et la précision du nombre : <code>%''largeur''.''précision''f</code> par exemple. La largeur est le nombre minimum de caractères que comporte un nombre. La signification de la précision dépend du type :
* pour un entier (<code>%d</code>, <code>%i</code>, <code>%x</code>) : nombre minimum de chiffre ;
* pour un réel en notation exponentielle ou décimale (<code>%e</code>, <code>%f</code>) : nombre de chiffres après la ivrgule ;
* pour un réel en notation «  adaptative  » (<code>%g</code>) : nombre de chiffres significatifs.
 
==== Lire les lignes une par une ====
Ligne 258 ⟶ 284 :
Si l'on connaît les positions des débuts de colonne, les nombres c1, c2, …, cn, on peut mettre le contenu de la colonne 5 avec
<source lang="scilab">
p = part(textetxt, [c5, c6 - 1])
</source>
et l'on peut séparer les difrentes colonnes pour les metre dans un vecteur avec
<source lang="scilab">
cellules = strsplit(textetxt, [c1, c2, …, cn])
</source>
 
Ligne 275 ⟶ 301 :
Si les séparateurs sont variables, on a intérêt à faire appel aux expressions régulières (voir ''[[../Calculs élémentaires#Rechercher, remplacer, découper une chaîne|Calculs élémentaires &gt; Rechercher, remplacer, découper une chaîne]]''). Par exemple, si les colonnes sont complétées par des caractères d'espacement (espaces, tabulations) en nombre indéterminé, on peut utiliser
<source lang="scilab">
cellules = strsplit(textetxt, '/\s+/)
</source>
Considérons par exemple le fichier <code>roisdefrance.txt</code>
 
Clovis Ier 466-511
La commande <code>fscanfMat</code> permet de lire directement une matrice dans un fichier texte (ASCII ou UTF-8). Dans sa syntaxe de base
Clodomir 495-524
Thierry Ier 485-534
Théodebert Ier 504-548
La séparation entre le nom du roi et la date est constituée de deux espaces ou plus. On veut créer une matrice dont la première colonne contient le nom du roi, la deuxième sa date de naissance et la troisième sa date de mort. On peut par exemple écrire
<source lang="scilab">
// lecture du fichier
M = fscanfMat('nomfichier');
fd = mopen('roisdefrance.txt');
texte = mgetl(fd, -1); // texte(i) contient la i-ème ligne
mclose(fd);
 
n = size(texte, 'r');
 
cellules = [];
 
// séparation des colonnes
for i = 1:n
cellules(i,:) = strsplit(texte(i), '/\s{2,}|-/')'
end
 
disp(cellules);
</source>
la fonction crée une matrice de nombre M à partir du fichier texte <code>nomfichier</code>, en éliminant l'en-tête (les premières lignes qui contiennent des caractères non numériques). On peut lui demander de metre le texte de l'en-tête dans une variable :
<source lang="scilab">
[M, entete] = fscanfMat('nomfichier');
</source>
Il est possible d'indiquer le format des données :
<source lang="scilab">
M = fscanfMat('nomfichier', 'format');
</source>
ou ''format'' est une chaîne de caractère qui peut être de la forme <code>%''type''</code>, par exemple :
* <code>%e</code> : réel en notation exponentielle ;
* <code>%f</code> : réel en notation décimale (point flottant) ;
* <code>%g</code> : réel en notation exponentielle si l'exposant est inférieur à -4, notation décimale sinon ;
* <code>%lg</code> : réel long (double précision) ;
* <code>%d</code> ou <code>%i</code> : nombre entier ;
* <code>%x</code> : entier hexadécimal.
La chaîne peut également contenir la largeur et la précision du nombre : <code>%''largeur''.''précision''f</code> par exemple. La largeur est le nombre minimum de caractères que comporte un nombre. La signification de la précision dépend du type :
* pour un entier (<code>%d</code>, <code>%i</code>, <code>%x</code>) : nombre minimum de chiffre ;
* pour un réel en notation exponentielle ou décimale (<code>%e</code>, <code>%f</code>) : nombre de chiffres après la ivrgule ;
* pour un réel en notation « adaptative » (<code>%g</code>) : nombre de chiffres significatifs.
 
=== Fonctions de gestion des fichiers ===