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

fclint Messages postés 3 Date d'inscription dimanche 22 août 2004 Statut Membre Dernière intervention 28 avril 2010 - 22 août 2004 à 16:43
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 - 27 août 2004 à 19:56
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

cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 20
22 août 2004 à 17:22
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
Ze_Dam Messages postés 340 Date d'inscription lundi 8 mars 2004 Statut Membre Dernière intervention 7 juillet 2005
22 août 2004 à 20:40
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
Scalpweb Messages postés 1467 Date d'inscription samedi 13 mars 2004 Statut Membre Dernière intervention 5 mai 2010 4
22 août 2004 à 22:30
Déjà, pour récupérer les données du fichier texte, tu sais faire ou pas ?
0
cs_philcam Messages postés 132 Date d'inscription dimanche 12 août 2001 Statut Membre Dernière intervention 17 octobre 2008
23 août 2004 à 02:53
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_philcam Messages postés 132 Date d'inscription dimanche 12 août 2001 Statut Membre Dernière intervention 17 octobre 2008
23 août 2004 à 03:00
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
cs_philcam Messages postés 132 Date d'inscription dimanche 12 août 2001 Statut Membre Dernière intervention 17 octobre 2008
23 août 2004 à 03:02
comme ça, ça ira mieux

RetVal = ShellExecuteA(0, "Open", App.Path & "\resultat.csv", "", "", 10)
0
Scalpweb Messages postés 1467 Date d'inscription samedi 13 mars 2004 Statut Membre Dernière intervention 5 mai 2010 4
23 août 2004 à 14:56
Oui, c'est une bonne technique comme ça.
0
cs_philcam Messages postés 132 Date d'inscription dimanche 12 août 2001 Statut Membre Dernière intervention 17 octobre 2008
23 août 2004 à 15:50
Super ton dernier commentaire, tu cherches pas à faire du scoring par hasard ?
remarque là j'suis pas mal non plus :big)
0
Scalpweb Messages postés 1467 Date d'inscription samedi 13 mars 2004 Statut Membre Dernière intervention 5 mai 2010 4
23 août 2004 à 18:25
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
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 20
23 août 2004 à 20:16
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
cs_philcam Messages postés 132 Date d'inscription dimanche 12 août 2001 Statut Membre Dernière intervention 17 octobre 2008
24 août 2004 à 01:39
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
fclint Messages postés 3 Date d'inscription dimanche 22 août 2004 Statut Membre Dernière intervention 28 avril 2010
27 août 2004 à 08:13
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
cs_philcam Messages postés 132 Date d'inscription dimanche 12 août 2001 Statut Membre Dernière intervention 17 octobre 2008
27 août 2004 à 13:51
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
Scalpweb Messages postés 1467 Date d'inscription samedi 13 mars 2004 Statut Membre Dernière intervention 5 mai 2010 4
27 août 2004 à 13:54
InStr$ c'est mieux que Intr$.... ;-)
Je préviens juste au cas où...
0
cs_philcam Messages postés 132 Date d'inscription dimanche 12 août 2001 Statut Membre Dernière intervention 17 octobre 2008
27 août 2004 à 14:34
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
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 20
27 août 2004 à 19:56
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
Rejoignez-nous