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

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBScript Discussion :

Fichier Texte : récupération de la dernière ligne même si elle est vide


Sujet :

VBScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 858
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 858
    Par défaut Fichier Texte : récupération de la dernière ligne même si elle est vide
    Bonjour,

    Je suis en train de faire un script pour parser des fichiers texte : j'ai besoin de traiter ligne par ligne les données des fichiers.
    Pour le moment, j'ai une routine simple qui récupère ligne par ligne le contenu de mes fichiers puis les copie dans un fichier de sortie.
    Le problème est que si la dernière ligne est vide, celle-ci n'est pas recopiée : comment puis-je faire ?
    Merci d'avance,

    Remarque : la double boucle imbriquée est normale car à terme, je vais avoir besoin de faire un traitement récursif pour gérer des blocs et des sous-bloc dans le contenu de mes fichiers... mais ça ne change pas grand chose au problème : le problème actuel est que textStreamIn.ReadLine ne semble pas pouvoir récupérer la dernière ligne si elle est vide.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
     
    Const ForReading = 1 
    Const ForWriting = 2
    Const ForAppending = 8
     
    Const TristateUseDefault = -2
    Const TristateTrue = -1
    Const TristateFalse = 0
     
    Const dbgFilename = "out.txt"
    Const inputDirectory = "./in"
    Const outputDirectory = "./out"
     
    ' pour le debug
    Const dbg_printLine = true
     
    Dim lineCount_out
    lineCount_out = 0
     
    run() 
     
     
    Function run()
    	Dim fso, textStreamDbg
    	Set fso = CreateObject("Scripting.FileSystemObject") 
     
    	' *********************************
    	' Nettoyage du dossier de sortie
    	If FolderExists(outputDirectory) = true Then
    		fso.DeleteFolder outputDirectory, True
    	End If
    	fso.CreateFolder outputDirectory
    	Set folderOut = fso.GetFolder(outputDirectory)
     
    	' *********************************
    	Set fso = CreateObject("Scripting.FileSystemObject") 
    	Set textStreamDbg = fso.CreateTextFile(dbgFilename, true) 
    	ParcourDossier textStreamDbg, inputDirectory, folderOut
    	textStreamDbg.Close
    End Function
     
     
    Function FolderExists(strFolderPath)
    	Dim fileObject
    	Set fileObject = CreateObject("Scripting.FileSystemObject")
     
    	On Error Resume Next ' Si erreur, continuer
    	FolderExists = fileObject.FolderExists(strFolderPath)
    	If Err.number <> 0 Then
    		FolderExists = False
    		Call Err.Clear()
    	End If
    	On Error Goto 0
    	Set fileObject = Nothing
    End Function
     
     
    Function ParcourDossier(textStreamDbg, directoryIn, folderOut)
        Dim fso, folder, subfolders, subfiles
    	Dim subfolderOut, subfolderOut_name, fileOut_path
     
    	Set fso = CreateObject("Scripting.FileSystemObject")
        Set folder = fso.GetFolder(directoryIn)
        Set subfolders = folder.SubFolders
        Set subfiles = folder.Files
     
        for each objFolder in subfolders
            'textStreamDbg.WriteLine(objFolder.Name)
     
    		subfolderOut_name = folderOut.Path & "\" &  objFolder.Name
    		fso.CreateFolder subfolderOut_name
    		Set subfolderOut = fso.GetFolder(subfolderOut_name)
     
            ParcourDossier textStreamDbg, objFolder, subfolderOut
        next
     
        for each objFile in subfiles
            'textStreamDbg.WriteLine("  " & objFile.Path)
    		'textStreamDbg.WriteLine("  " & objFile.Name)
     
    		fileOut_path = folderOut.Path & "\" & objFile.Name
     
    		parseFile textStreamDbg, objFile, fileOut_path
        next
    End Function
     
    Function parseFile(textStreamDbg, objFile, fileOut_path)
    	Set fso = CreateObject("Scripting.FileSystemObject")
     
    	textStreamDbg.WriteLine("***** [File] " & objFile.Path & " *****")
    	parseTextFile textStreamDbg, objFile, fileOut_path
     
    End Function
     
     
    Function parseTextFile(textStreamDbg, objFile, fileOut_path)
    	Dim textStreamIn, textStreamOut
     
    	Set fso = CreateObject("Scripting.FileSystemObject") 
    	Set textStreamIn = fso.OpenTextFile(objFile.Path, ForReading, TristateTrue)
     
    	textStreamDbg.WriteLine(fileOut_path)
    	Set textStreamOut = fso.CreateTextFile(fileOut_path, true) 
     
    	'Do While textStreamIn.AtEndOfStream = false
    	Do Until textStreamIn.AtEndOfStream
    		parseTextZone textStreamDbg, objFile, textStreamIn, textStreamOut
    	Loop ' textStreamIn
     
    	textStreamOut.Close
    	textStreamIn.Close
     
    End Function
     
    Function parseTextZone(textStreamDbg, objFile, textStreamIn, textStreamOut)	
    	Dim line
     
    	'Do While textStreamIn.AtEndOfStream = false
    	Do Until textStreamIn.AtEndOfStream
    		line = textStreamIn.ReadLine
    		If dbg_printLine = true Then
    			textStreamDbg.WriteLine("Get New Line (" & objFile.Name & "): " & line)
    		End If
     
    		' test for last line (if it is an empty line)
    		If(lineCount_out > 0) Then
    			textStreamOut.WriteLine("")
    		End If
    		lineCount_out = lineCount_out + 1
    		textStreamOut.Write(line)
     
    	Loop ' textStreamIn
    End Function

  2. #2
    Membre averti
    Homme Profil pro
    Automaticien
    Inscrit en
    Novembre 2020
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Automaticien
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2020
    Messages : 15
    Par défaut
    Bonjour,

    Pourquoi vouloir copier une ligne vide?

    Le fichier texte s'arrête à la dernière ligne non vide.

  3. #3
    Modérateur
    Avatar de l_autodidacte
    Homme Profil pro
    Retraité : Directeur de lycée/Professeur de sciences physiques
    Inscrit en
    Juillet 2009
    Messages
    2 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Retraité : Directeur de lycée/Professeur de sciences physiques
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 2 420
    Par défaut
    Un exemple pour savoir si la dernière ligne est vide ou non. Si le résultat retourné est le même, il n'y a pas de ligne vide à la fin du texte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Const ForReading = 1
    Dim fso, f, ra, n, R
    n= 0
       Set fso = CreateObject("Scripting.FileSystemObject")
       Set f = fso.OpenTextFile("testfile.txt", ForReading) ' soit un texte de plusieurs lignes
     
    Function GetLines
       Set f = fso.OpenTextFile("testfile.txt", ForReading)
       ra =   f.ReadAll
       GetLines = f.Line
    End Function
    'Wscript.Sleep 1000
      While Not f.AtEndOfStream
       R = f.ReadLine
           If R<>"" Then   n = n + 1 'Avec une condition, on recherche toutes les lignes non vides
         'n = n + 1  ' sans condition, on cherche si la dernière ligne est vide
      Wend
    MsgBox "Nbr Lignes = " & GetLines & "    Lignes non vides = " & n
    Ne pas oublier le tag si satisfait.
    Voter pour toute réponse satisfaisante avec pour encourager les intervenants.
    Balises CODE indispensables. Regardez ICI
    Toujours utiliser la clause Option Explicit(VBx, VBS ou VBA) et Ne jamais typer variables et/ou fonctions en VBS.
    Vous pouvez consulter mes contributions
    Ne pas oublier de consulter les différentes FAQs et les Cours/Tutoriels VB6/VBScript
    Ne pas oublier L'Aide VBScript et MSDN VB6 Fr

  4. #4
    Expert confirmé
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 132
    Par défaut
    Salut

    Une autre approche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    Const ForReading = 1
    Dim oFso, f
    Dim ContenuLgn, ContenuDerLigne
    Set oFso = CreateObject("Scripting.FileSystemObject")
     
    'Ouverture et lecture du fichier
    	Set f = oFso.OpenTextFile("C:\MesProgs\En VBScript et HTA\Lire fichier par la fin\test.txt", ForReading)
            'récupération d'un tableau de x lignes
            ContenuLgn = split(f.ReadAll,vbnewline)
            f.close
            set f = nothing
            'pour obtenir la dérniere ligne
            ContenuDerLigne =ContenuLgn(ubound(ContenuLgn))
            MsgBox ContenuDerLigne,,"ceci est la dernière ligne, elle est vide"
     
     
            ' pour la démo
            'lecture des lignes en commencant par la dernière ligne
            for f = ubound(ContenuLgn) to Lbound(ContenuLgn) Step -1
                    If f = ubound(ContenuLgn) Then
                            msgbox "Ligne N°" & f+1 & vbnewline & ContenuLgn(f),,"Dernière ligne"
                            Else
                            msgbox "Ligne N°" & f+1 & vbnewline & ContenuLgn(f)
                    End If
            next
     
     ' contenu du fichier test.txt
     'A que coucou
     'voilà voilà
     '
    La partie essentiel étant de la ligne 7 à 13.
    :whistle:pourquoi pas, pour remercier, un :plusser: pour celui/ceux qui vous ont dépannés.
    saut de ligne
    OOOOOOOOO👉 → → Ma page perso sur DVP ← ← 👈

Discussions similaires

  1. [WD-2007] Supprimer dernière page si elle est vide
    Par Ltspitfire dans le forum VBA Word
    Réponses: 2
    Dernier message: 08/01/2015, 10h25
  2. Réponses: 2
    Dernier message: 30/09/2013, 16h39
  3. Réponses: 15
    Dernier message: 30/01/2008, 18h23
  4. Réponses: 8
    Dernier message: 23/06/2006, 13h51
  5. rendre invisible une texte box si elle est vide
    Par kuhnden dans le forum IHM
    Réponses: 4
    Dernier message: 09/03/2006, 01h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo