Récupération de chaîne d'un fichier texte

Signaler
Messages postés
3
Date d'inscription
dimanche 22 août 2004
Statut
Membre
Dernière intervention
28 avril 2010
-
Messages postés
3757
Date d'inscription
mardi 23 septembre 2003
Statut
Membre
Dernière intervention
13 mars 2006
-
J'ai de nombreux fichiers texte contenant la syntaxe suivante :
nom : duran
prénom : paul
commentaire : il était une fois un marchand de foie

Je souhaite en VB récupérer la valeur de chacun des champs nom, prénom, commentaire et les intégrer dans un seul fichier de type Excel (en créant un csv ou directement en macro VB Excel pourquoi pas)

16 réponses

Messages postés
3757
Date d'inscription
mardi 23 septembre 2003
Statut
Membre
Dernière intervention
13 mars 2006
18
Salut,
Quelle est la structure actuelle de fichiers texte ? Un petit exemple ?

Cordialement, CanisLupus

Tous les glands ne deviennent pas des chênes mais tous les chênes ont été des glands
0
Messages postés
340
Date d'inscription
lundi 8 mars 2004
Statut
Membre
Dernière intervention
7 juillet 2005

oui mais ce n'est qu'avec du vba ou alors avec un exe normal qui va renvoyer les données dans excel via l'automation, sous plus précis stp
0
Messages postés
1467
Date d'inscription
samedi 13 mars 2004
Statut
Membre
Dernière intervention
5 mai 2010
4
Déjà, pour récupérer les données du fichier texte, tu sais faire ou pas ?
0
Messages postés
132
Date d'inscription
dimanche 12 août 2001
Statut
Membre
Dernière intervention
17 octobre 2008

Salut, j'avais 5mn à perdre alors je t'ai pondu ce que moi je ferai dans de telles conditions.

tu mets une filelistbox sur ta Form et tu mtes tes fichiers texte dans le même répertoire que l'appli

et ensuite tu mets ça dans la procedure form_load
et c'est parti :

Private Sub Form_Load()

Dim L$()

File1.Pattern = "*.txt"
File1.Path = App.Path

Open App.Path & "\resultat.csv" For Output As #2

    For i = 0 To File1.ListCount - 1
    
        Open App.Path & "" & File1.List(i) For Input As #1
        
            While Not EOF(1)
                Line Input #1, coco
                L$ = Split(coco, ":")
                Print #2, Trim$(L$(1)) & ";";
            Wend
        Close #1
        
        Print #2,
    
    Next i

Close #2

End Sub


j'espère que ça te convient :)

@+
0
Messages postés
132
Date d'inscription
dimanche 12 août 2001
Statut
Membre
Dernière intervention
17 octobre 2008

J'oubliais tu peux l'ouvrir automatiquement dans excel en mettant cette ligne en déclaration publique

Public Declare Function ShellExecuteA Lib "shell32" (ByVal hwnd As Long, ByVal LPFile As String, ByVal PathFile As String, ByVal Other As String, ByVal Other2 As String, ByVal Param As Long) As Long


et ça à la fin de ta form load

RetVal = ShellExecuteA(0, "Open", App.Path & "\exportationEXCEL.csv", "", "", 10)


ça c'est pas de moi mais ça sert bien ;)

@+
0
Messages postés
132
Date d'inscription
dimanche 12 août 2001
Statut
Membre
Dernière intervention
17 octobre 2008

comme ça, ça ira mieux

RetVal = ShellExecuteA(0, "Open", App.Path & "\resultat.csv", "", "", 10)
0
Messages postés
1467
Date d'inscription
samedi 13 mars 2004
Statut
Membre
Dernière intervention
5 mai 2010
4
Oui, c'est une bonne technique comme ça.
0
Messages postés
132
Date d'inscription
dimanche 12 août 2001
Statut
Membre
Dernière intervention
17 octobre 2008

Super ton dernier commentaire, tu cherches pas à faire du scoring par hasard ?
remarque là j'suis pas mal non plus :big)
0
Messages postés
1467
Date d'inscription
samedi 13 mars 2004
Statut
Membre
Dernière intervention
5 mai 2010
4
Non, je tenais juste à te dire que sa m'avais appris des trucs sur l'ouvertur d'excel, parceque je suis vraiment pas très bon maintenant...
Mais excusez moi, si on a plus le droit de s'exprimer, je ferais attention. Surtout que moi, si je veux me faire des points, je préfères poser des sources.

Bon, à part ça, je te remercie parceque ton code m'a aidé. Voilà.
0
Messages postés
3757
Date d'inscription
mardi 23 septembre 2003
Statut
Membre
Dernière intervention
13 mars 2006
18
Ben c'est bien tout ça, les bouts de codes de philcam sont très utiles mais avant, il faudrait quand même connaître la vraie structure du fichier texte de départ.

G bien lu :
nom : duran
prénom : paul
commentaire : il était une fois un marchand de foie

Si le fichier se présente vraiment comme ça, alors j'aurais plutôt codé :

for i = 1 to 2 ' pour les 1ers champs
Line Input #1, coco
L$ = Split(coco, ":")
Print #2, Trim$(L$(1)) & ";";
next
Line Input #1, coco 'pour le dernier champ
L$ = Split(coco, ":")
Print #2, Trim$(L$(1)) & vbcrlf

à la place de :

Line Input #1, coco
L$ = Split(coco, ":")
Print #2, Trim$(L$(1)) & ";";

sinon, lors de la récup en excel, il y aura 1 seule ligne de 3 * nombre de noms enregistrés.

Mais, g déjà vu ce genre de question, posée exactement pareil et le fichier texte s'est révélé être construit de la manière suivante :

une ligne par enreg du type :
duran paul il était une fois un marchand de foie
le nom sur x cars, prénom sur y cars, commentaire sur z cars.
Et là, le traitement est complètement différent.

Cordialement, CanisLupus

Tous les glands ne deviennent pas des chênes mais tous les chênes ont été des glands
0
Messages postés
132
Date d'inscription
dimanche 12 août 2001
Statut
Membre
Dernière intervention
17 octobre 2008

Je ne vois pas bien ce que tu veux dire, mais il y a bien un "print #2" à la fin du code qui sert à passer à la ligne suivante, je suis bien d'accord qu'il y a des ";" à la fin de chaque ligne mais j'ai pas trop fignolé
en tout cas j'ai testé et ça fonctionne comme ça

Au fait sans rancune scalpweb, je déconnais :)

@+
0
Messages postés
3
Date d'inscription
dimanche 22 août 2004
Statut
Membre
Dernière intervention
28 avril 2010

Mes fichiers texte ressemble plûtôt à : fiche001.txt
nom : dupont
prénom : paul
commentaire : il était
une fois
dans la ville de foix
commentaire 2 : il était une
seconde
fois dans la ville de foix

En clair, dans ce fichier de m... pour un champ (exemple : commentaire) tout n'est pas sur la même ligne et donc le SPLIT (":") ça fonctionne que si tout est sur la même ligne par champ

Comment je peux faire :
pour chaque fichier .txt du répertoire courant, prendre tout ce qui suit après "nom :" jusqu'à "prénom :" et ainsi de suite
toujours pour alimenter un fichier .csv
0
Messages postés
132
Date d'inscription
dimanche 12 août 2001
Statut
Membre
Dernière intervention
17 octobre 2008

faudrait rajouter un truc du genre :

Intr$(1, coco, ":")

comme ça si la ligne ne contient pas de ":" on la rajoute à la suite de la précédente

y'a toujours moyen de décortiquer un fichier texte.
0
Messages postés
1467
Date d'inscription
samedi 13 mars 2004
Statut
Membre
Dernière intervention
5 mai 2010
4
InStr$ c'est mieux que Intr$.... ;-)
Je préviens juste au cas où...
0
Messages postés
132
Date d'inscription
dimanche 12 août 2001
Statut
Membre
Dernière intervention
17 octobre 2008

t'as de la chance que j'ai que ça à foutre en ce moment :)

Donc j'ai retapé le code, ça se complique un peu faut dire, j'ai trouvé une soluce dans l'urgence, c'est pas hypercatholique mais ça fonctionne
ce coup-ci il faut un textbox et un filelistbox sur ta feuille et coller ça dans ta Form

Private Declare Function ShellExecuteA Lib "shell32" (ByVal hwnd As Long, ByVal LPFile As String, ByVal PathFile As String, ByVal Other As String, ByVal Other2 As String, ByVal Param As Long) As Long

Private Sub Form_Load()

Dim L$()

File1.Pattern = "*.txt"
File1.Path = App.Path

For i = 0 To File1.ListCount - 1
    Text1 = ""
    
    Open App.Path & "" & File1.List(i) For Input As #1
        While Not EOF(1)
            Line Input #1, coco
            If InStr(1, coco, ":") Then Text1 = Text1 & vbCrLf
            Text1 = Text1 & Trim$(coco) & " "
        Wend
    Close #1
    
    chemin = App.Path & "\New_" & File1.List(i)
    
    Open chemin For Output As #2
        Print #2, Text1
    Close #2
    
    Kill App.Path & "" & File1.List(i)
Next i

Open App.Path & "\resultat.csv" For Output As #2
    For i = 0 To File1.ListCount - 1
            Open App.Path & "\New_" & File1.List(i) For Input As #1
                While Not EOF(1)
                Line Input #1, coco
                If coco = "" Then GoTo 100
                L$ = Split(coco, ":")
                Print #2, Trim$(L$(1)) & ";";
100
                Wend
            Close #1
        Print #2,
    Next i
Close #2

RetVal = ShellExecuteA(0, "Open", App.Path & "\resultat.csv", "", "", 10)

End Sub


j'ai testé avec un genre de fichier comme tu l'as dit et ça marche, maintenant avec ça tu devrais pouvoir te débrouiller.

ça fera 50€ , j'accepte la CB :-p

@+
0
Messages postés
3757
Date d'inscription
mardi 23 septembre 2003
Statut
Membre
Dernière intervention
13 mars 2006
18
C trop prise de tête ton truc !

Si la réponse de philcam te convient, clique sur "réponse acceptée".

Sinon, tes fichiers texte ont une structure que j'appelle anarchique ou aléatoire.

Je ne crois pas qu'on puisse récupérer automatiquement en une seule fois et sans intervention humaine le contenu de tes fichiers pour les transformer en fichier csv. Le mieux serait de revoir la manière dont ils sont créés au départ.

Un exemple d'impossibilité de récupération automatique :
Qu'est ce qui empêche un utilisateur de saisir dans ses commentaires : ":", "nom"," prénom", "commentaire", ..... et tous autres mots ou signes qui pourraient permettre un découpage des enregs de tes fichiers ?

Donc, faudra procéder au coup par coup. Les exemples qui t'on été proposés ne seront donc jamais complets, il faudra que tu t'en inspires pour créer ta propre usine à gaz.

Cordialement, CanisLupus

Tous les glands ne deviennent pas des chênes mais tous les chênes ont été des glands
0