IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

INTRODUCTION AU LANGAGE VBSCRIPT


précédentsommaire

VI. Les fichiers texte

Un fichier texte est un fichier contenant des lignes de texte. Examinons la création et l'utilisation de tels fichiers sur des exemples.

VI-A. Création et utilisation

Image non disponible
Résultats
Sélectionnez
C:\>cscript fic1.vbs
C:\>dir
FIC1 VBS 352 07/01/02 7:07 fic1.vbs
TESTFILE TXT 25 07/01/02 7:07 testfile.txt
C:\>more testfile.txt
Ceci est un autre test.

Commentaires

  • la ligne 7 crée un objet fichier de type "Scripting.FileSystemObject" par la fonction CreateObject("Scripting.FileSystemObject"). Un tel objet permet l'accès a tout fichier du système pas simplement a des fichiers texte.
  • la ligne 9 crée un objet "TextStream". La création de cet objet est associée a la création du fichier testfile.txt. Ce fichier n'est pas désigne par un nom absolu du genre c:\dir1\dir2\….\testfile.txt mais par un nom relatif testfile.txt. Il sera alors crée dans le répertoire d'ou sera lancée la commande d'exécution du fichier.
  • le système de fichiers du système windows n'a pas connaissance de concepts tels que fichier texte ou fichier non texte. Il ne connaît que des fichiers. C'est donc au programme qui exploite ce fichier de savoir s'il va le traiter comme un fichier texte ou non.
  • La ligne 9 crée un objet d'où la commande set utilisée pour l'affectation. La création d'un objet fichier texte passe par la création de 2 objets :

    • la création d'un objet Scripting.FileSystemObject (ligne 7)
    • puis par la création d'un objet "TextStream" (fichier texte) par la méthode OpenTextFile de l'objet Scripting.FileSystemObject qui admet plusieurs paramètres :

      • le nom du fichier a gérer (obligatoire)
      • le mode d'utilisation du fichier. C'est un entier avec 3 valeurs possibles :

        • 1 : utilisation du fichier en lecture
        • 2 : utilisation du fichier en écriture. S'il n'existe pas déjà et si le 3ième paramètre est présent et a la valeur true, il est créé sinon il n'est pas. S'il existe déjà, il est écrasé.
        • 8 : utilisation du fichier en ajout, c.a.d. écriture en fin de fichier. Si le fichier n'existe pas déjà et si le 3ième paramètre est présent et a la valeur true, il est créé sinon il n'est pas.
  • la ligne 11 écrit une ligne de texte avec la méthode WriteLine de l'objet TextStream crée.
  • la ligne 13 "ferme" le fichier. On ne peut alors plus écrire ou lire dedans.
  • la ligne 16 crée un nouvel objet "TextStream" pour exploiter le même fichier que précédemment mais cette fois-ci en mode "ajout". Les lignes qui seront écrites le seront derrière les lignes existantes.
  • la ligne 18 écrit deux nouvelles lignes sachant que la constante vbCRLF est la marque de fin de ligne des fichiers texte.
  • la ligne 20 ferme de nouveau le fichier
  • la ligne 23 le rouvre en mode "lecture" : on va lire le contenu du fichier.
  • La ligne 27 lit une ligne de texte avec la méthode ReadLine de l'objet TextStream. Lorsque le fichier vient d'être "ouvert", on est positionne sur la 1ere ligne de texte de celui-ci.Lorsque celle-ci a été lue par la méthode ReadLine, on est positionné sur la seconde ligne.
    Ainsi la méthode Readline non seulement lit la ligne courante mais "avance" ensuite automatiquement a la ligne suivante.
  • Pour lire toutes les lignes de texte, la méthode ReadLine doit être appliquée de façon répétée dans une boucle. Celle-ci (ligne 26) se termine lorsque l'attribut AtEndOfStream de l'objet TextStream a la valeur true. Cela signifie alors qu'il n'y a plus de lignes a lire dans le fichier.

VI-B. Les cas d'erreur

On rencontre deux cas d'erreur fréquents :

  • ouverture en lecture d'un fichier qui n'existe pas
  • ouverture en écriture ou ajout d'un fichier qui n'existe pas avec le troisième paramètre a false dans l'appel a la méthode OpenTextFile.

Le programme suivant montre comment détecter ces erreurs :

Programme
Sélectionnez
' création & remplissage d'un fichier texte
Option Explicit
Dim objFichier,MyFile
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Dim codeErreur
' on crée un objet fichier
Set objFichier=CreateObject("Scripting.FileSystemObject")
' on ouvre un fichier texte devant exister en lecture
On Error Resume Next
Set MyFile= objFichier.OpenTextFile("abcd", ForReading)
codeErreur=err.number
On Error GoTo 0
If codeErreur<>0 Then
' le fichier n'existe pas
wscript.echo "Le fichier [abcd] n'existe pas"
Else
' on ferme le fichier texte
MyFile.Close
End If
' on ouvre un fichier texte devant exister en écriture
On Error Resume Next
Set MyFile= objFichier.OpenTextFile("abcd", ForWriting, False)
codeErreur=err.number
On Error GoTo 0
If codeErreur<>0 Then
wscript.echo "Le fichier [abcd] n'existe pas"
Else
' on ferme le fichier texte
MyFile.Close
End If
' on ouvre un fichier texte devant exister en ajout
On Error Resume Next
Set MyFile= objFichier.OpenTextFile("abcd", ForAppending, False)
codeErreur=err.number
On Error GoTo 0
If codeErreur<>0 Then
wscript.echo "Le fichier [abcd] n'existe pas"
Else
' on ferme le fichier texte
MyFile.Close
End If
' fin
wscript.quit 0
Résultats
Sélectionnez
C:\>dir
FIC1 VBS 964 07/01/02 7:54 fic1.vbs
TESTFILE TXT 0 07/01/02 8:18 testfile.txt
FIC2 VBS 1 252 07/01/02 8:23 fic2.vbs
3 fichier(s) 2 216 octets
2 répertoire(s) 4 007.11 Mo libre
C:\>cscript fic2.vbs
Le fichier [abcd] n'existe pas
Le fichier [abcd] n'existe pas
Le fichier [abcd] n'existe pas

VI-C. L'application IMPOTS avec un fichier texte

Nous reprenons l'application de calcul de l'impôt en supposant que les données nécessaires au calcul de l'impôt sont dans un fichier texte appelé data.txt :

 
Sélectionnez
12620 13190 15640 24740 31810 39970 48360 55790 92970 127860 151250 172040 195000 0
0 0,05 0,1 0,15 0,2 0,25 0,3 0,35 0,4 0,45 0,5 0,55 0,6 0,65
0 631 1290,5 2072,5 3309,5 4900 6898,5 9316,5 12106 16754,5 23147,5 30710 39312 49062

Les trois lignes contiennent respectivement les données des tableaux limites, coeffR et coeffN de l'application. Grâce à la modularisation de notre application, les modifications interviennent essentiellement dans la procédure getData chargée de construire les trois tableaux. Le nouveau programme est le suivant :

Programme
Sélectionnez
' calcul de l'impôt d'un contribuable
' le programme doit être appelé avec trois paramètres : marié enfants salaire
' marié : caractère O si marié, N si non marié
' enfants : nombre d'enfants
' salaire : salaire annuel sans les centimes
' déclaration obligatoire des variables
Option Explicit
Dim erreur
' on récupère les arguments en vérifiant leur validité
Dim marie, enfants, salaire
erreur=getArguments(marie,enfants,salaire)
' erreur ?
If erreur(0)<>0 Then wscript.echo erreur(1) : wscript.quit erreur(0)
' on récupère les données nécessaires au calcul de l'impôt
Dim limites, coeffR, coeffN
erreur=getData(limites,coeffR,coeffN)
' erreur ?
If erreur(0)<>0 Then wscript.echo erreur(1) : wscript.quit 5
' on affiche le résultat
wscript.echo "impôt=" & calculerImpot(marie,enfants,salaire,limites,coeffR,coeffN)
' on quitte sans erreur
wscript.quit 0
' ------------ fonctions et procédures
' ----------- getArguments
Function getArguments(byref marie, ByRef enfants, ByRef salaire)
' doit récupérer trois valeurs passées comme argument au programme principal
' un argument est transmis au programme sans espaces devant et derrière
' on utilisera des expression régulières pour vérifier la validité des données
' rend un variant tableau erreur à 2 valeurs
' erreur(0) : code d'erreur, 0 si pas d'erreur
' erreur(1) : message d'erreur si erreur sinon la chaîne vide
Dim syntaxe
syntaxe= _
"Syntaxe : pg marié enfants salaire" & vbCRLF & _
"marié : caractère O si marié, N si non marié" & vbCRLF & _
"enfants : nombre d'enfants (entier >=0)" & vbCRLF & _
"salaire : salaire annuel sans les centimes (entier >=0)"
' on vérifie qu'il y a 3 arguments
Dim nbArguments
nbArguments=wscript.arguments.count
If nbArguments<>3 Then
' msg d'erreur
getArguments= array(1,syntaxe & vbCRLF & vbCRLF & "erreur : nombre d'arguments
incorrect")
' fin
Exit Function
End If
Dim modele, correspondances
Set modele=new regexp
' le statut marital doit être parmi les caractères oOnN
modele.pattern="^[oOnN]$"
Set correspondances=modele.execute(wscript.arguments(0))
If correspondances.count=0 Then
' msg d'erreur
getArguments=array(2,syntaxe & vbCRLF & vbCRLF & "erreur : argument marie
incorrect")
' on quitte
Exit Function
End If
' on récupère la valeur
If lcase(wscript.arguments(0)) = "o"Then
marie=true
Else
marie=false
End If
' enfants doit être un nombre entier >=0
modele.pattern="^\d{1,2}$"
Set correspondances=modele.execute(wscript.arguments(1))
If correspondances.count=0 Then
' erreur
getArguments= array(3,syntaxe & vbCRLF & vbCRLF & "erreur : argument enfants
incorrect")
' on quitte
Exit Function
End If
' on récupère la valeur
enfants=cint(wscript.arguments(1))
' salaire doit être un entier >=0
modele.pattern="^\d{1,9}$"
Set correspondances=modele.execute(wscript.arguments(2))
If correspondances.count=0 Then
' erreur
getArguments= array(4,syntaxe & vbCRLF & vbCRLF & "erreur : argument salaire
incorrect")
' on quitte
Exit Function
End If
' on récupère la valeur
salaire=clng(wscript.arguments(2))
' c'est fini sans erreur
getArguments=array(0,"")
End Function
' ----------- getData
Function getData(byref limites, ByRef coeffR, ByRef coeffN)
' les données des trois tableaux limites, coeffR, coeffN sont dans un fichier texte
' appelé data.txt. Chaque tableau occupe une ligne sous la forme val1 val2 ... valn
' on trouve dans l'ordre limites, coeffR, coeffN
' rend un variant erreur tableau à 2 éléments pour gérer l'éventuelle erreur
' erreur(0) : 0 si pas d'erreur, un nombre entier >0 sinon
' erreur(1) : le message d'erreur si erreur
Dim objFichier,MyFile,codeErreur
Const ForReading = 1, dataFileName="data.txt"
' on crée un objet fichier
Set objFichier=CreateObject("Scripting.FileSystemObject")
' on ouvre le fichier data.txt en lecture
On Error Resume Next
Set MyFile= objFichier.OpenTextFile(dataFileName, ForReading)
' erreur ?
codeErreur=err.number
On Error GoTo 0
If codeErreur<>0 Then
' il y a eu erreur - on la note
getData=array(1,"Impossible d'ouvrir le fichier des données [" & dataFileName & "]
en lecture")
' on rentre
Exit Function
End If
' on suppose maintenant que le contenu est correct et on ne fait aucune vérification
' on lit les 3 lignes
' limites
Dim ligne, i
ligne=MyFile.ReadLine
getDataFromLine ligne,limites
' coeffR
ligne=MyFile.ReadLine
getDataFromLine ligne,coeffR
' coeffN
ligne=MyFile.ReadLine
coeffN=split(ligne," ")
getDataFromLine ligne,coeffN
' on ferme le fichier
MyFile.close
' c'est fini sans erreur
getData=array(0,"")
End Function
' ----------- getDataFromLine
Sub getDataFromLine(byref ligne, ByRef tableau)
' met dans tableau les valeurs numériques contenues dans ligne
' celles-ci sont séparées par un ou plusieurs espaces
' au départ le tableau est vide
tableau=array()
' on définit un modèle pour la ligne
Dim modele, correspondances
Set modele= New RegExP
With modele
.pattern="\d+,\d+|\d+" ' 140,5 ou 140
.global=true ' toutes les valeurs
End With
' on analyse la ligne
Set correspondances=modele.execute(ligne)
Dim i
For i=0 To correspondances.count-1
' on redimensionne le tableau
ReDim Preserve tableau(i)
' on affecte une valeur au nouvel élément
tableau(i)=cdbl(correspondances(i).value)
Next
'fin
End Sub
' ----------- calculerImpot
Function calculerImpot(byval marie,ByVal enfants,ByVal salaire, ByRef limites, ByRef
coeffR, ByRef coeffN)
' on calcule le nombre de parts
Dim nbParts
If marie=true Then
nbParts=(enfants/2)+2
Else
nbParts=(enfants/2)+1
End If
If enfants>=3 Then nbParts=nbParts+0.5
' on calcule le quotient familial et le revenu imposable
Dim revenu, qf
revenu=0.72*salaire
qf=revenu/nbParts
' on calcule l'impôt
Dim i, impot
i=0
Do While i<ubound(limites) And qf>limites(i)
i=i+1
Loop
calculerImpot=int(revenu*coeffr(i)-nbParts*coeffn(i))
End Function

Commentaires :

  • dans le fichier texte data.txt, les valeurs peuvent être séparées par un ou plusieurs espaces, d'ou l'impossibilité d'utiliser la fonction split pour récupérer les valeurs de la ligne. Il a fallu passer par une expression régulière
  • la fonction getData rend, outre les trois tableaux limites, coeffR, coeffN, un résultat indiquant s'il y a eu erreur ou non. Ce résultat est un variant tableau de eux éléments. Le premier élément est un code d'erreur (0 si pas d'erreur), le second le message d'erreur s'il y a eu erreur.
  • la fonction getData ne teste pas la validité des valeurs trouvées dans le fichier data.txt. En situation réelle, elle devrait le faire.

précédentsommaire

Licence Creative Commons
Le contenu de cet article est rédigé par Serge Tahé et est mis à disposition selon les termes de la Licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Partage dans les Mêmes Conditions 3.0 non transposé.
Les logos Developpez.com, en-tête, pied de page, css, et look & feel de l'article sont Copyright © 2002 Developpez.com.