Lire un fichier txt avec repture

cs_mohellebi Messages postés 98 Date d'inscription mercredi 31 octobre 2007 Statut Membre Dernière intervention 1 août 2019 - 15 févr. 2014 à 12:29
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 - 22 févr. 2014 à 21:45
Bonjour, tout le monde
L'une des parties de mon application développé sous vb 2010\sql serveur 2008, consiste à importer des données sous forme txt dans ma base.
ma procédure d'importation est de créer un fichier csv à partir d'un fichier txt et de l'importer à l aide d'un scripte sql
maintenant mon souci c'est que le fichier de base(TXT) est structuré avec des ruptures
après des recherches sur le net, j'ai trouvé que je pourrai utilisé une heachtable, mais j'ai aucune idée de son utilisation
Voila un exemple de mon fichier txt ainsi que le code pour la lecture et la création du csv


Fichier TXT Fichier CSV

agence 1
Billet Nom
1 12435363 XXXXX 1|12435363|XXXXX
2 43537376 YYYYYY ==> 1|43537376|YYYYYY
3 76576545 AAAAA 1|76576545|AAAAA
agence 2 2|65476776|BBBBB
4 65476776 BBBBB 2|86453454|CCCCC
5 86453454 CCCCC



code de lecture :

  
 Do Until objstreamreader.Peek = -1

controle = Mid(strLine, 1, 3)


 strLine = objstreamreader.ReadLine()
           
If InStr(chif, controle) Then
            agence = Mid(strLine, 6, 4)
            billet = Mid(strLine, 9, 8)
           nom= mid(strLine ,30,25)
         

                lecture = agence & "|" &  billet  & "|" & nom
           
     objstreamwriter.WriteLine(lecture)

          end if        
        Loop

        objstreamreader.Close()
        objstreamwriter.Close()
       


Merci d'avance pour votre aide précieuse

14 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
15 févr. 2014 à 12:47
Bonjour,
"j'ai trouvé que je pourrai utilisé une heachtable"
Pas très sérieux, tout cela ...
Tu pourrais au moins faire l'effort de ne pas "massacrer" les termes employés !
.A moins que tu ne sois capable de nous dire ce que c'est, que cette "heachtable"
Nous avons bien deviné, mais il n'est pas vraiment admissible, sur ce forum technique, d'avoir à "deviner" !
0
cs_mohellebi Messages postés 98 Date d'inscription mercredi 31 octobre 2007 Statut Membre Dernière intervention 1 août 2019 3
15 févr. 2014 à 14:14
heureusement que j'ai bien précisé que c'est une orientation que j'ai trouvé sur le net , en revanche je trouve que ce n'est pas terrible pour un expert ou bien même un amateur qui a déjà utilisé cette fonction, afin de comprendre que ce n'est pas une heachtable mais une Hashtable
merci quand même pour ton intervention afin de faire plus attention à l avenir, mais j'aurai aimé une aide efficace sur le problème
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
15 févr. 2014 à 21:38
Bonjour

maintenant mon souci c'est que le fichier de base(TXT) est structuré avec des ruptures

explique ce que veut dire rupture ?
0
cs_mohellebi Messages postés 98 Date d'inscription mercredi 31 octobre 2007 Statut Membre Dernière intervention 1 août 2019 3
15 févr. 2014 à 22:15
Bonsoir ,
qui veut dire des sections, comme illustré dans mon exemple.
je m'explique : dans mon cas au lieu d'avoir un numéro d'agence pour chaque billet qui aurait été très facile à traiter, ici j'ai un seul numéro d'agence pour tous les billets, autrement dit comment associer le numero d'agence à chaque billet afin d'obtenir le fichier csv illustré ci dessus?
impossible de continuer mon projet sans résoudre ce problème alors merci d'avance shayW
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
15 févr. 2014 à 23:30
la structure de ton fichier text n'est pas clair
il est ainsi ?

1
1 12435363 XXXXX
2 43537376 YYYYYY
3 76576545 AAAAA
2
4 65476776 BBBBB
5 86453454 CCCCC

entre les données tu as un blank ? un tab ?
0
cs_mohellebi Messages postés 98 Date d'inscription mercredi 31 octobre 2007 Statut Membre Dernière intervention 1 août 2019 3
16 févr. 2014 à 10:45
Justement le tab c'est pour marquer la rupture ou la section, dans mon exemple les billets 1,2,3 appartient à l'agence 1. 4 et 5 à l'agence 2.....etc
à partir de cette structure je voudrai obtenir le csv suivent :

1|12435363|XXXXX
1|43537376|YYYYY
1| 76576545|AAAAA
2|65476776|BBBBB
2|86453454|CCCCC

j'espère être plus clair
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
16 févr. 2014 à 12:02
ça j'ai compris je t'ai demandé dans le fichier text
la ligne
1 12435363 XXXXX
entre les item tu as 1 espaces 2 espaces plus ?
0
cs_mohellebi Messages postés 98 Date d'inscription mercredi 31 octobre 2007 Statut Membre Dernière intervention 1 août 2019 3
17 févr. 2014 à 20:08
Bonsoir, tout le monde
désolé pour le retard, effectivement le fichier comporte des espaces entre les item et les ruptures
je précise que la structure du fichier que j'avais déposé n'est qu'un exemple, après je ne sais pas est ce que c'est possible de posé carment le fichier avec le quel je travaille ??
merci encore ShayW
0

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

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
16 févr. 2014 à 14:00
Bonjour,
et surtout : ne pas confondre un fichier texte "structuré" avc un fichier texte "organisé". Ce n'est pas la même chose.
Un fichier texte structuré a les données qu'il contient réparties selon une structure définie. Un fichier texte "organisé" ne peut qu'être "plat" (pas de structure).
0
cs_mohellebi Messages postés 98 Date d'inscription mercredi 31 octobre 2007 Statut Membre Dernière intervention 1 août 2019 3
17 févr. 2014 à 20:15
bonsoir,
En fait c'est un fichier générer par un logiciel, du coup bien structuré , autrement je ne pourrais pas travailler avec
je galère encore à le lire avec rupture
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
17 févr. 2014 à 20:36
En fait c'est un fichier générer par un logiciel, du coup bien structuré
donc tu connais sa structure
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
17 févr. 2014 à 21:27
à tester

Private Sub Proceed(ByVal pathfilein As String, ByVal pathfileout As String)
Dim listin As New List(Of String)
Dim listout As New List(Of String)
Dim items() As String
Dim agencynumber As String = String.Empty
Dim csvstring As String = String.Empty
Try
listin = System.IO.File.ReadAllLines(pathfilein).ToList
For Each item As String In listin
items = item.Split(New Char() {}, StringSplitOptions.RemoveEmptyEntries)
If items.Count = 1 Then
agencynumber = items(0).Trim
Else
csvstring = agencynumber & "|" & items(1) & "|" & items(2)
listout.Add(csvstring)
End If

Next
IO.File.WriteAllLines(pathfileout, listout.ToArray)
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub

Proceed(Application.StartupPath & "\text1.txt", Application.StartupPath & "\text1.csv")
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
17 févr. 2014 à 21:54
Bonjour, cs_ShayW

et cette partie ? :
agence  1
Billet Nom ============> celle-là
1 12435363 XXXXX

...
( à moins que son premier message ne soit pas exact quant au fichier concerné)
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 17/02/2014 à 22:33
Je ne sais pas pourquoi (peut-être parce que la moitié de mon sang est corse), je mettrais personnellement entre crochets toutes les lignes où il y a "agence", puis traiterais comme un fichier ini, que je lirais alors facilement pour en faire un csv.

PS : j'ajoute que je n'y vois pas du tout un fichier "structuré", mais un fichier texte plat mis en forme (probablement pour présenter des résultats sous cette forme. Un rapport, quoi)

Il est d'ailleurs assez étrange que l'on ait à partir d'un tel fichier pour établir le csv souhaité. Il faut alors croire que l'on cherche à trouver des données que l'on n'a pas.
Car si on les avait, ces données, ce serait à partir d'elles (et pas d'un rapport d'exploitation) que l'on établirait directement le csv souhaité.
0
cs_mohellebi Messages postés 98 Date d'inscription mercredi 31 octobre 2007 Statut Membre Dernière intervention 1 août 2019 3
Modifié par cs_mohellebi le 20/02/2014 à 21:11
Bonjour, Ucfoutu
déjà que je suis vraiment désolé pour le retard car je suis sur un autre module en attendant la solution , bon bref pour rependre franchement, je croyais q'un fichier txt structuré est un rapport d'exploitation txt structuré par en-tête, colonnes bien précises..ect.
en effet les données existe bien sur , mais sur un serveur externe et pas moyen de les avoir autrement que ce fichier qui me torture , après je ne sais pas si possible d'avoir de l'aide à partir du code que j'avais posté vu que je travaille plus alaise avec l'espace IO
Merci d'avoir pris du temps pour m'aider
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
17 févr. 2014 à 23:33
Bonjour Ucfoutu

je ne pense pas que les strings agence billet nom font partie du
fichier c'est l'ajout de cs_moe... pour expliquer le fichier
0
cs_mohellebi Messages postés 98 Date d'inscription mercredi 31 octobre 2007 Statut Membre Dernière intervention 1 août 2019 3
20 févr. 2014 à 21:10
Bonsoir ShayW, un grand merci pour ton code , maintenant je vais essayer de l'exploiter et de te rendre le verdict
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
21 févr. 2014 à 08:48
Tu n'as pas répondu avec précision aux questions fort justifiées de cs_ShayW (son message du 15 févr. 2014 à 23:30) ===>> ce qui fait que demeurent beaucoup d'incertitudes quant au traitement le plus adapté !
Je persiste à dire que l'idée d'une transformation en .ini serait une bonne solution.
Mais si tu préfères traiter directement le texte, tout en faisant "face" aux tabulations et/ou espaces éventuellement présents, voici un mécanisme qui devrait être infaillible :
Je l'ai écrit en VB6, mais l'ai suffisamment commenté pour rendre simple une transposition en VB.Net
 Dim FF As Integer: FF = FreeFile
Open "D:\cs_mohellebi.txt" For Input As #FF
strtext = Input(LOF(FF), #FF) ' ======>> je "ramasse" tout le contyenu du fichier
Close #FF
' on ne sait pas (tu n'as pas répondu) si séparés par des tab, des espaces ou conjugaison des deux ===>> et donc :
strtext = Replace(strtext, vbTab, " ") '======>> j'enlève les tabulations éventuelles
Do While InStr(strtext, " ")
strtext = Replace(strtext, " ", " ") '===>> je transforme en un seul espace les chaines de + d'un espace
Loop
toto = Split(strtext, vbCrLf) ' ==========>> j'éclate par lignes (séparées par un retour-charriot)
For i = 0 To UBound(toto)
If Not IsNumeric(Left(Trim(toto(i)), 1)) Then ' si le trim de l'article n'est pas numérique
toto(i) = "#" ' ===>> je mets "#"
Else
toto(i) = Trim(toto(i)) ' ===>>> sinon, le le "trim"
End If
Next
' ne me reste plus qu'à supprimer du "join" (avec vbcrlf) de cet array
' toutes les lignes #+vbcrlf
' et à y remplacer les espaces par un "|"
strtext = Replace(Replace(Join(toto, vbCrLf), "#" & vbCrLf, ""), " ", "|")
FF = FreeFile
' puis j'écris dans le fichier
Open "D:\cs_mohellebi.txt" For Output As #FF
Print #FF, strtext;
Close #FF
--
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
21 févr. 2014 à 10:12
Houla ! Je viens de voir que c'est un autre résultat, que tu veux !
Et du coup : message à cs_ShayW ; relis bien le premier message : tu vas voir que ton hypothèse (ton message du 17 févr. 2014 à 23:33) tombe totalement à l'eau . Ce sont bel et bien des chaînes de caractères figurant dans le fichier et non des ajouts de cs_mohellebi.
Et nous avons donc vraiment à travailler sur un fichier/rapport texte plat mis en forme et non à un fichier structuré.
Je vais donc tout recommencer.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 21/02/2014 à 10:46
Voilà :
   Dim FF As Integer, i As Long, num As Integer, strtext As String, pos As Integer, toto
FF = FreeFile
Open "D:\cs_mohellebi.txt" For Input As #FF
strtext = Input(LOF(FF), #FF) ' ======>> je "ramasse" tout le contyenu du fichier
Close #FF
' on ne sait pas (tu n'as pas répondu) si séparés par des tab, des espaces ou conjugaison des deux ===>> et donc :
strtext = Replace(strtext, vbTab, " ") '======>> j'enlève les tabulations éventuelles
Do While InStr(strtext, " ")
strtext = Replace(strtext, " ", " ") '===>> je transforme en un seul espace les chaines de + d'un espace
Loop
toto = Split(strtext, vbCrLf) ' ==========>> j'éclate par lignes (séparées par un retour-charriot)
For i = 0 To UBound(toto) - 1
toto(i) = Trim(toto(i)) ' ===>> j'enlève tous les espaces devant etr derrière l'article

If Not IsNumeric(Left(toto(i), 1)) Then '=====>> si ne commence pas par un numérique
If Left(toto(i), 7) = "agence " Then ' ===>>> si ligne dit "agence"
num = Val(Mid(toto(i), 8)) ' === j'extrais le n° d'agence
toto(i) = "#" ' ===>> je mets "#"
Else '===>> juste pour le cas où tu aurais, en plus, des parasites
toto(i) = "#" ' ===>> je mets "#"
End If
Else
pos = InStr(toto(i), " ") '====>> position du 1er espace de la ligne
Mid(toto(i), 1, pos) = num ' ===>> je remplace par le N° d'agence
End If
Next
' ne me reste plus qu'à supprimer du "join" (avec vbcrlf) de cet array
' toutes les lignes #+vbcrlf
' et à y remplacer les espaces par un "|"
strtext = Replace(Replace(Join(toto, vbCrLf), "#" & vbCrLf, ""), " ", "|")
FF = FreeFile
' puis j'écris dans le fichier
Open "D:\cs_mohellebi1.txt" For Output As #FF
Print #FF, strtext;
Close #FF

Vraiment pas très "normal" d'avoir à travailler de cette manière (reconstitution de données à partir d'un texte "rapport") !

Gaffe, hein : à transposer en VB.Net (facile à partir de mes commentaires)


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
Modifié par cs_ShayW le 21/02/2014 à 12:17
Bonjour Ucfoutu

J'attends le verdict de mohellebi (j'ai pris un avocat lol)
pour l'instant en net cela m'est plus facile

Private Sub Proceed(ByVal pathfilein As String, ByVal pathfileout As String)
Dim listin As New List(Of String)
Dim listout As New List(Of String)
Dim items() As String
Dim agencynumber As String = String.Empty
Dim csvstring As String = String.Empty
Try
listin = System.IO.File.ReadAllLines(pathfilein).ToList
For Each item As String In listin
'on retire tous les espaces et les tab entre les strings
items = item.Split(New Char() {}, StringSplitOptions.RemoveEmptyEntries)
If items(0).ToLower.StartsWith("agence") Then
agencynumber = items(1).Trim
ElseIf items(0).ToLower <> ("billet") Then
csvstring = agencynumber & "|" & items(1) & "|" & items(2)
listout.Add(csvstring)
End If

Next
IO.File.WriteAllLines(pathfileout, listout.ToArray)
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
0
cs_mohellebi Messages postés 98 Date d'inscription mercredi 31 octobre 2007 Statut Membre Dernière intervention 1 août 2019 3
22 févr. 2014 à 20:54
Bonsoir,
je pense que mon avocat n'est pas terrible du coup le verdict n'a rien donné lol , si non honnêtement j'ai pas compris le code que tu m'avais proposé, dans le sens ou j'ai jamais travaillé avec ces paramètres,à partir de là j'ai pas pu comprendre les messages d'erreur , d'un autre coté je voulais poster le fichier txt réel afin d'éviter toute confusion sur sa forme , mais là je n'arrive pas à le posté correctement vu que l'éditeur ne propose pas un format txt
si possible d'avoir un peu plus d'explication ou de m'aider selon le code que j'avais posté au début
encore un grand merci pour ton aide
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
Modifié par cs_ShayW le 22/02/2014 à 22:27
j'ai jamais travaillé avec ces paramètres,à partir de là j'ai pas pu comprendre les messages d'erreur
quels message d'erreur et quels parametres ?
j'ai mal commenté le code
Private Sub Proceed(ByVal pathfilein As String, ByVal pathfileout As String)
'pathfilein est le chemin de ton fichier txt
'pathfileout est le chemin de ton fichier csv

Dim listin As New List(Of String)
Dim listout As New List(Of String)
Dim items() As String
Dim agencynumber As String = String.Empty
Dim csvstring As String = String.Empty
Try
'on lit toutes les lignes du fichier txt dans listin
listin = System.IO.File.ReadAllLines(pathfilein).ToList
'on va traiter chaque ligne de listin
For Each item As String In listin
'on découpe la ligne en plusieurs string en retirant
'les espaces
items = item.Split(New Char() {}, StringSplitOptions.RemoveEmptyEntries)
'on verifie si le premier mot = agence
If items(0) = "agence" Then
'si oui on garde le numéro d'agence dans 'agencynumber
agencynumber = items(1).Trim
'autrement si la ligne ne commence pas par billet
'ex 2 43537376 YYYYYY
ElseIf items(0) <> "billet" Then
' on va former cscstring avec le numéro d'agence '(agencynumber)
' |43537376|YYYYYY
csvstring = agencynumber & "|" & items(1) & "|" & items(2)
'on ajoute csvstring à la liste listout
listout.Add(csvstring)
End If
Next
'on copie listout dans le fichier csv
IO.File.WriteAllLines(pathfileout, listout.ToArray)
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
0
Rejoignez-nous