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

Contenu supprimé Contenu ajouté
→‎Découper une ligne en colonnes : export vers Programmation#Analyse et construction de chaînes de caractères
, dans [] car la virgule n'est pas systématique ; remise de id=... ; mise en cohérence
Ligne 51 :
Il est possible d'appliquer un format aux données dans un format proche du Fortran.
 
<span id = "read1">''Syntaxe :''</span>
<source lang="scilab" id = "write2">
write (fichier, a ,[, format])
[x]=read (fichier ,m ,n ,[, format])
</source>
 
Ligne 68 :
=== Exemples ===
 
<source lang="scilab">
x=linspace(0, 2*%pi, 100)';
y=sin(x);
Ligne 76 :
Cet exemple écrit la table de la fonction sinus dans le fichier <code>sinus.txt</code>, chaque ligne représente un point.
 
<source lang="text">
sinus.txt:
0.000 0.000
Ligne 88 :
Si le format est omis, Scilab décide d'un format approprié.
La commande :
<source lang="scilab">
write('sinus.txt', [x y]);
</source>
écrira le fichier suivant :
<source lang="text">
sinus.txt:
0.0000000000000000 0.0000000000000000
Ligne 105 :
Inversement le fichier <code>temperature.txt</code> contient l'heure, la temperature et l'humidité relevé.
 
<source lang="text">
temperature.txt:
18 -1 86
Ligne 112 :
</source>
 
Sa lecture se fera par la commande <code>read()</code> :
 
<source lang="scilab">
a=read ("temperature.txt", -1, 3);
</source>
Ligne 121 :
La matrice <code>a</code> de type flottant contient :
 
<source lang="text">
a =
Ligne 140 :
== Sauvegarde de variables en binaire ==
 
Il est possible d'exporter le résultat d'un calcul dans un fichier, ce qui permet de le réutiliser pour une autre fois. Ceci se fait avec la commande <code><font id="save1">save</font></code> :
 
<source lang="scilab">
save (fichier, a, b, c, ...)
</source>
 
Cela enregistre les variables <code>a</code>, <code>b</code>, <code>c</code>, ..., dans le fichier de nom <code>fichier</code>.
Si aucune variable n'est spécifiée, toutes les variables de l'environnement de travail sont enregistrées.
 
Ce résultat peut ensuite être réimporté avec la commande <code><font id="load1">load</font></code> :
 
<source lang="scilab">
load (fichier, a, b, c, ...)
</source>
 
Cela lit les variables <code>a</code>, <code>b</code>, <code>c</code>, ..., présentes dans le fichier de nom <code>fichier</code>.
Cela lit les variables <code>a</code>, <code>b</code>, <code>c</code>, …, présentes dans le fichier de nom <code>fichier</code>. Il s'agit du nom des variables tel qu'il a été spécifié lors de la commande <code>save</code>. De même que précédemment, si aucun variable n'est spécifiée, toutes les variables présentes dans le fichier sont chargées.
De même que précédemment, si aucun variable n'est spécifiée, toutes les variables présentes dans le fichier sont chargées.
 
Le fichier produit est un fichier binaire. Chaque variable est représentée par :
* le nom de la variable, sur 24 octets :
** chaque caractère correspond à un code : 10 à 35 pour les minuscules de « a » à « z », -35 à -10 pour les capitales de « Z » à « A » ; taper <code><font id="str2code2">str2code(<nowiki>'</nowiki>''chaine''<nowiki>'</nowiki>)</font></code> pour avoir la suite de codes correspondant à la chaîne ''chaine'' ;
** le nom se termine par le code 40 ;
* un code représentant le type de la variable : de 1 pour une matrice de réels en virgule flottante, 2 pour un polynôme, 10 pour un chaîne de caractères… taper <code><font id="type1">type(''X'')</font></code> pour avoir le code du type de la variable ''X'' ;
* puis suit la description de la variable, notamment le nombre d'éléments pour les matrices, chaînes… cette description dépend du type de la variable ;
* enfin vient la valeur de la variable.
L'instruction <code><font id="listvarinfile1">listvarinfile(<nowiki>'</nowiki>''nom_de_fichier''<nowiki>'</nowiki>)</font></code> permet d'avoir la liste des variable contenues dans un fichier et leur description.
 
== Enregistrer un graphique ==
 
Scilab permet de sauvegarder des graphiques sous plusieurs formats. Il faut au préalable donner un numéro à la fenêtre graphique, en indiquant <code><font id="scf1">scf</font>(''numéro'')</code> avant les instructions de tracé.
 
La syntaxe générale des fonctions d'export est la suivante :
 
<source lang="scilab">
xs2format (id, fichier)
</source>
 
* <code>id</code> : Entierentier, l'identifiant du grapphique à exporter. Cet identifiant peut être obtenu par la fonction <code>gcf</code>. ;
* <code>fichier</code> : Chaînechaîne de caratère, le nom du fichier, sans oublier l'extention, dans lequel le graphique sera enregistré.
Les fonctions sont :
* <code>xs2bmp</code> : format BMP (''bitmap'', Microsoft Windows);
Ligne 186 ⟶ 190 :
''Exemple :''
 
[[Image:exemple_scilab_sin_cos.gif|rightthumb|Courbe sinus et cosinus.]]
 
<source lang="scilab">
f = gcf ();
x = linspace (0, 2*%pi, 200)';
Ligne 194 ⟶ 199 :
</source>
 
L'export de graphiques sous scilab semble se faire par copie d'écran, cela signifie qu'il peut y avoir des problèmes si lors de la commande <code>xs2...xs2…</code>, la fenêtre contenant le graphique n'est pas clairement visible à l'écran.
 
 
 
== Sons ==
 
Lorsque la variable ''x'' est un vecteur, on peut le sauvegarder sous la forme d'un <font id="son2">son</font>, dans un fichier de type <fontcode id="wav1">.WAVwav</fontcode>. Le son correspond à des varations de pression de l'air, ou des variations de la tension d'alimentation du haut-parleur, ''s'' de la forme
: ''s''(''t<sub>i</sub>'' ) = ''x''(''i'' )
avec
: ''t<sub>i</sub>''  = ''i''/ƒ
ƒ étant la fréquence d'échantillonnage. Par défaut, ƒ vaut {{unité|22050|hertz}} (une valeur de ''x'' correspond à 1/{{formatnum:22050}} seconde).
 
Par défaut, ƒ vaut {{unité|22050|hertz}} (une valeur de ''x'' correspond à 1/{{formatnum:22050}} seconde).
La création du fichier se fait avec la fonction <code><font id="savewave1">savewave</font></code>
 
<source lang="scilab">
savewave(<nowiki>'</nowiki>''nom_de_fichier''<nowiki>'</nowiki>, x)
</source>
 
'''ilIl faut bien s'assurer qu'il s'agit d'une matrice colonne'''.
 
La création du fichier se fait avec la fonction <code><font id="savewave1">savewave</font></code>
savewave(<nowiki>'</nowiki>''nom_de_fichier''<nowiki>'</nowiki>, x)
'''il faut bien s'assurer qu'il s'agit d'une matrice colonne'''.
On peut aussi définir une autre fréquence d'échantillonnage entière :
 
savewave(<nowiki>'</nowiki>''nom_de_fichier''<nowiki>'</nowiki>, x, f)
<source lang="scilab">
Un fichier .WAV peut être mis dans une matrice avec la fonction <code><font id="loadwave1">loadwave</font></code> :
x=loadwavesavewave(<nowiki>'</nowiki>''nom_de_fichier''<nowiki>'</nowiki>, x, f)
chaqueUn lignefichier de la matrice correspondant alors à un canal<code>. Onwav</code> peut ensuiteêtre jouermis cedans sonune dans Scilabmatrice avec l'instructionla fonction <code><font id="playsnd1loadwave1">playsnd</font>loadwave</code> :
 
playsnd(x)
<source lang="scilab">
x = loadwave('nom_de_fichier')
</source>
 
chaque ligne de la matrice correspondant alors à un canal. On peut ensuite jouer ce son dans Scilab avec l'instruction <code id="playsnd1">playsnd()</code>
 
<source lang="scilab">
playsnd(x)
</source>
 
''Voir aussi [[Découvrir Scilab Graphiques et sons#son1|Graphiques et sons]].''
Ligne 225 ⟶ 241 :
Différentes fonctions sont directement inspirées de la syntaxe du langage C.
 
* <source lang="scilab" id = "mopen1">
[fd, err] = mopen (fichier, mode)
</source> Ouverture du fichier de nom <code>fichier</code>. Le mode d'ouverture correspond àest <code>"r"</code> pour lecture, <code>"w"</code> pour écriture et <code>"a"</code> pour ajout.<br /> La fonction retourne un scalaire « descripteur » <code>fd</code> qui sert à identifier le fichier dans les fonctions suivantes. Le code d'erreur peut être récupéré par la variable <code>err</code>, il vaut 0 si l'ouverture s'est déroulée correctement.
* <source lang="scilab" id = "mfprintf1">mfprintf (fd, format [, x1 [, x2, ...]])
</source> EcritureÉcriture dans le fichier d'identifiant <code>fd</code>. Le paramètre <code>format</code> est une chaîne de caractère décrivant le formatage des données. Cette fonction est équivalente à la fonction <code>fprintf</code> du langage C (voir ''[[Programmation C-C++/Entrée / sortie de base#La fonction printf]]'').
* <source lang="scilab" id="mfscanf1">
y(1,1:3) = mfscanf(fd, '%f %f %f\n')
</source> balaie ''(scan)'' le fichier numéro <code>fd</code> de manière séquentielle, et récupère les trois premières données et les met dans la première ligne d'une matrice de trois colonne appelée ''y'' ; <source lang="scilab">
y(2,1:3) = mfscanf(fd, '%f %f %f\n')
</source> continue l'opération de rapatriement et met les données dans la deuxième ligne de la matrice ;
* <source lang="scilab" id = "mclose1">
mclose (fd)
</source> Ferme le fichier d'identifiant <code>fd</code>
Ligne 246 ⟶ 262 :
 
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 nombres 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 mettre 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 ;
Ligne 272 ⟶ 294 :
 
La fonction <code>mgetl</code> lit une ou plusieurs lignes d'un fichier texte
 
<source lang=scilab>
<source lang="scilab">
txt = mgetl ('nomfichier', m)
txt = mgetl (fd, m)
</source>
 
Si le fichier a été ouvert (avec <code>mopen</code>, il dispose d'un descripteur <code>fd</code> qui permet d'y faire référence ; sinon, on peut utiliser le nom du fichier. Si ''m'' est omis ou vaut -1, la fonction lit toutes les lignes. Si ''m'' est un entier strictement positif, la fonction lit ''m'' lignes (accès séquentiel). La variable <code>txt</code> est une matrice colonne, chaque ligne correspondant à une ligne du fichier.
 
Ligne 283 ⟶ 307 :
 
Si l'on connaît les positions (index) des débuts de colonne, les nombres c1, c2, …, cn, on peut utiliser la commande <code>part()</code> pour extraire une colonne. Par exemple, pour extraite la colonne 5 :
 
<source lang="scilab">
p = part(txt, [c5, c6 - 1])
</source>
 
On peut également séparer les différentes colonnes pour les mettre dans un vecteur avec
 
<source lang="scilab">
cellules = strsplit(txt, [c1, c2, …, cn])
Ligne 292 ⟶ 319 :
 
Une ligne — une chaîne de caractères — contient souvent des délimiteurs. S'il s'agit d'une chaîne de caractères fixes, on peut utiliser la commande <code>tokens()</code> :
 
<source lang=scilab>
<source lang="scilab">
t = tokens('a = 5', '=')
</source>
 
crée la matrice <code>['a ' ; '=' ; ' 5']</code>.
 
Si les séparateurs sont variables, on a intérêt à faire appel aux expressions régulières (voir ''[[../Programmation#Expressions régulières|Programmation &gt; Expressions régulières]]''). 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(txt, '/\s+/)
</source>
 
Considérons par exemple le fichier <code>roisdefrance.txt</code>
 
Clovis Ier 466-511
<source lang="text">
Clodomir 495-524
ThierryClovis Ier 485 466-534511
Clodomir 495-524
Théodebert Ier 504-548
ClovisThierry Ier 466485-511534
Théodebert Ier 504-548
</source>
 
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