OVH Cloud OVH Cloud

CasseTête-lecture d'un fichier TEXTE

49 réponses
Avatar
Ingrid
Hello Tout le monde,
Voilà ma problématique: J'ouvre 2 fichiers txt, un en Input et deuxieme en
ajout APPEND.
Le 1er fichier est structuré en ligne je souhaite transformer en colonne
dans le fichier 2. Je m'explique parce que c'est compliqué:
Exemple:
Dans le fichier Input j'ai par ex:
Ingrid
28ans
Neerlandaise
Je souhaite transformer ces données en tableau dans le fichier 2 append :
Ingrid 28ans Neerlandaise
Donc mes questions sont les suivantes:
1- Comment faire pour que dans la meme boucle de passer d'une ligne à une
autre pour le fichier1 et de rester à la meme ligne pour le fichier 2.
2- c quoi le code qui permet de passer d'une colonne à une autre dans un
fichier texte.

Ce truc me rend folle.

Je vous serai reconnaissant si vous arrivez à m'aider.

Kisses

Ingrid

10 réponses

1 2 3 4 5
Avatar
Gloops
Salut Ingrid,

Je te voyais venir avec des champs supplémentaires, en me disant que tu
allais savoir les ajouter, mais le coup du nombre variable de champs, je
n'avais pas prévu.

ça ne pose guère de problème, mais je ne suis pas très sûr d'avoir
compris ce qu'il y a autour.

Tu veux dire que si une ligne commence par "abc" il faut la copier telle
quelle et arrêter le traitement ?

If UCase(Left(Ligne1, 4)) = "A" Then



Bon, ce qui vient après ça, c'est quelque chose qu'on ne va pas faire
souvent. Left(Ligne1, 4), ça représente les quatre premiers caractères
de Ligne1, donc ça ne peut pas faire "A", même après conversion en
majuscules. La condition sera donc toujours fausse.

Si il s'agit de répartir dans les colonnes en fonction du premier
caractère, ne te casse pas la tête, ça roule.

Est-ce que la première ligne ne représenterait pas justement
l'affectation des initiales des champs ?

Dans le genre BCAD signifierait qu'une ligne commençant par B serait
transcrite dans la première colonne, une commençant par C serait
transcrite dans la deuxième, et pareil pour A et D dans la troisième et
la quatrième ?

Si ce n'est pas ça je n'ai pas bien compris le rôle de la première
ligne, ni comment doivent s'affecter les codes de champs, c'est-à-dire
comment je dois savoir dans quelle colonne doit aller une ligne qui
commence par un N, par exemple.

Si c'est bien ça, il suffit de mettre la lettre représentant le champ
une fois, puisque les champs sont séparés par un caractère séparateur,
il n'y a donc pas de longueur à indiquer.

Bien entendu, si plusieurs lignes commencent par le même code, seule la
dernière sera prise en compte. Pour le passage d'un enregistrement à
l'autre (d'une personne à l'autre), doit-on toujours se baser sur le
nombre de lignes, ou changer d'enregistrement en rencontrant une ligne
séparatrice ?

Comme tu t'en doutes, il s'agit d'avoir une convention bien claire si on
veut que le programme réponde à tes attentes.

A bientôt.
Avatar
LE TROLL
Ah, ok "gloops", ben on va faire le point:

C'est toi qui parle de 3 colonnes, alors j'ai conservé
"l'image" de ton expression pour justement ne pas rompre ton
explication mystique, je te cite (réponse 22/3/5 à 19h22),
tu dis: "Si ce point est gênant, on s'orientera vers les
COLONNES à largeur fixe"

D'autre part, en parlant de mysticisme (là c'est moi),
tu réponds:
"En supposant clair que 3n représente un multiple de 3, n
étant un entier, 3n signifiant 3 multiplié par n."

Tu ne crois pas que ce genre de réponse c'est
incompréhensible justement pour une personne qui "a déjà du
mal" (comme tu dis)...

D'ailleurs elle te répond:
"Cher Gloops, Merci pour ta réponse qui necessite un bac+11
pour le comprendre...:-)...lol...
"Ce n'et pas sympa de se moquer de mon français alors que je
viens expres dans ce forum francçais avec un but d'apprendre
mieux votre magnifique langue...je veux bien te voir parler
Dutch..:-)...

Effectivement, t'es à côté de la plaque, tes propos sont
incohérents et prétentieux, pour preuve, la réponse de
l'intéressée!

D'autre part, ce n'est pas à toi que je réponds,
contrairement à toi qui me réponds, non, je réponds à la
personne qui pose une question, donc je ne réponds pas à ta
question mais à la sienne, de facto, je ne serai
effectivement pas dans le fil de ta réponse, ne t'en
déplaîse...

Par ailleurs, pour reprendre ton code:
"While Not EOF(1)"

C'est incompréhensible, on est pas en C avec des trucs du
genre "i++", tu pourrais écrire correctement, soit:
While EOF(pointeur) <> true

Ton second bout de code:
"LigneCible = Ligne1 + ";" + Ligne2 + ";" + Ligne3"

Encore une fois, on est en VB, le "+" est réservé au
opérations pas aux chaîne, c'est très mal choisit! Il faut
mettre:
LigneCible = Ligne1 & ";" & Ligne2 & ";" & Ligne3

Les "#" aussi ne servent à rien généralement, etc, bref y
aurait beaucoup à dire, trop même, programme un peu mieux
avant de me faire des remontrances!

Concernant ton code, d'un style assez néophyte en VB pour le
moins, ben à 20h04 j'avais déjà mis en place dans ma réponse
le principe du code à appliquer (j'ai dis le principe), et
toi tu reprends le même principe à 22h43, commence par lire
les réponses des autres au lieu de draguer, ça t'évitera de
répondre ce qui a été répondu!

Concernant le fait que tu veuilles l'exclusivité de la
discussion, ben si tu veux la draguer, tu le fais par
courrier, mais pas ici, ok!

In fine, évites de répondre en fin, ça me fatigue le
doigt de rouler la molette, si je veux savoir ce qui a été
écrit je reprends les posts un par un, on ne répond pas en
cours, ça a été débattu déjà ici, la majorité répond au
début!
---------------------------

"Gloops" a écrit dans le message de news:
4240885c$0$19347$
Oui mais je ne me rappelle pas qu'il ait été question que
le fichier source comporte trois colonnes. Si tu traites un
autre sujet, sois gentil d'ouvrir un autre fil, Ingrid a
déjà assez de mal.
Avatar
LE TROLL
Salut,

Tu soulèves trop de problèmes en même temps:
- la gestion des fichiers
- la gestion des chaînes
- la gestion des erreurs
- Et sans doute d'autres, comme les chemins (path), etc...

Le mieux serait peut être que tu traites ça par mail en
envoyant ton fichier data, ainsi tu pourrais mieux
comprendre en voyant le code qui résoudrait le problème, car
sur un newsGroups tu va avoir du mal à traiter 4 ou 5 sujets
de front... Il faudrait les voir un par un.

Si tu veux m'envoyer tas datas:

--------------------------------------
montmartre75018 AROBASE free.fr
--------------------------------------

"Ingrid" a écrit dans le
message de news:

Hello Tout le monde,
Voilà ma problématique: J'ouvre 2 fichiers txt, un en
Input et deuxieme en
ajout APPEND.
Le 1er fichier est structuré en ligne je souhaite
transformer en colonne
dans le fichier 2. Je m'explique parce que c'est
compliqué:
Exemple:
Dans le fichier Input j'ai par ex:
Ingrid
28ans
Neerlandaise
Je souhaite transformer ces données en tableau dans le
fichier 2 append :
Ingrid 28ans Neerlandaise
Donc mes questions sont les suivantes:
1- Comment faire pour que dans la meme boucle de passer
d'une ligne à une
autre pour le fichier1 et de rester à la meme ligne pour
le fichier 2.
2- c quoi le code qui permet de passer d'une colonne à une
autre dans un
fichier texte.

Ce truc me rend folle.

Je vous serai reconnaissant si vous arrivez à m'aider.

Kisses

Ingrid


Avatar
jean-marc
"Ingrid" wrote in message
news:
gloops,
ça marche mais ça répond pas completement à mon probleme et ceci pour la
raison suivante:
1-Parce que dans mon exemple on a fixé 3 lignes comme hypothèse et s'il y


en
avait x lignes, on fait comment?
je te donne un exercice avec ton code un peu retouché par des conditions :
voilà j'ai un fichier sortie dans lequel il y a les informations


suivantes:

Hello,

voici une fonction qui résoud ton problème, complètement cette fois je
pense:
J'ai testé avec exactement le fichier que tu donnais, et le résultat produit
est:

Ingrid;28ans;Dutch;Sympa;Amatrice en Informatique
Gloops;32ans;Français;Specialiste en Informatique
Jacques;50ans;German;Insuportable;Nul en Informatique

Les hyppothèses sont qu'un champ commence par "A" - "Z"
Toutes les autres lignes sont ignorées
On peut avoir autant de champs que l'on veut (MAX_FIELDS)

Voici le code:

'----------------------------------------
Private Const MAX_FIELDS = 50

Private Sub TransformFile(inputFile As String, outputFile As String)
Dim inp As Integer, outp As Integer
Dim s As String
Dim fields(MAX_FIELDS) As String
Dim nb_fields As Integer
Dim i As Integer
Dim first_car As String

On Error GoTo err_TF

inp = FreeFile
Open inputFile For Input As #inp
outp = FreeFile
Open outputFile For Output As #outp
While Not EOF(inp)
Line Input #inp, s
first_car = Mid$(s, 1, 1)
If (first_car >= "A") And (first_car <= "Z") Then
' a new valied field
' is it a "A" (first field)
If first_car = "A" Then
' 2 cases here
' a complete record is ready to be read or it's the first
one
If nb_fields = 0 Then
' ok its a new record - just store it
nb_fields = nb_fields + 1
' keep only from character position 3, to remove "A:",
"Z:", etc.
fields(nb_fields) = Mid$(s, 3)
Else
' whowhowho ! we got a complete record!
' let's write it
For i = 1 To nb_fields
Print #outp, fields(i);
If i <> nb_fields Then
Print #outp, ";";
End If
Next i
Print #outp, "" ' just to insert a Carriage
Return/LineFeed
' Now restore field count
nb_fields = 1
' store the beginning of this new record
fields(nb_fields) = Mid$(s, 3)
End If
Else
' ok just add a field in the array
nb_fields = nb_fields + 1
' keep only from character position 3, to remove "A:", "Z:",
etc.
fields(nb_fields) = Mid$(s, 3)
End If
Else
' nothing to do, we just ignore the ligne
End If
Wend
' end of file
' do we have somethiong to write ?
If nb_fields > 0 Then
' ok, just write it
For i = 1 To nb_fields
Print #outp, fields(i);
If i <> nb_fields Then
Print #outp, ";";
End If
Next i
Print #outp, "" ' just to insert a Carriage Return/LineFeed
End If
' That's it :-)
Close #inp
Close #outp
end_TF:
Exit Sub
err_TF:
MsgBox "error : " & Err.Description & " (" & Err.Number & ")"
Resume end_TF
End Sub

' ----------------- Sample call -------------------
Private Sub Command1_Click()
Call TransformFile("D:JMDvpmt#VBng376data.txt",
"D:JMDvpmt#VBng376dataOUT.txt")
End Sub

Bonne programmation!

--
Jean-marc
"There are only 10 kind of people
those who understand binary and those who don't."
Avatar
Pascal B.
"LE TROLL" a écrit:
| Par ailleurs, pour reprendre ton code: "While Not EOF(1)"
|
| C'est incompréhensible, on est pas en C avec des trucs du
| genre "i++", tu pourrais écrire correctement, soit:
| While EOF(pointeur) <> true

Petite précision (déjà signalé, mais il y en a qui sont bornés):
Utiliser "True" ou "False" dans une expression booléenne pour une condition est totalement RIDICULE et INUTILE...
Par exemple, ici dans le cas présent, la fonction EOF retourne déjà True ou False, il n'est pas nécessaire de recomparer le résultat
à True ou à False! (même pas pour la compréhension du code !)
La bonne syntaxe est bien "While Not EOF(1)" de Gloops (ou "Until EOF(1)" mais c'est un autre débat)

Cordialement,
Pascal B.
Avatar
LE TROLL
Salut

While Not EOF(p)
While EOF(p) = false

C'est sans équivoque, borné ou pas, la seconde ligne est
plus compréhensible!
Dans ta seconde ligne, on doit deviner que c'est une
égalité qu'on recherche (faute de connaître), tandis que
dans ma première ligne, on sait que c'est une égalité que
l'on cherche...

On n'enlève pas ce qui altère la compréhension, on
n'enlève seulement ce qui est inutile, et "not" pour qui ne
sait pas, vicie la compréhension, ça ne veut rien dire en
français, et on ne programme pas dans un style mathématique,
mais linguistique...

Le borné te salut bien :o)
----------

"Pascal B." a écrit dans le
message de news:
"LE TROLL" a écrit:
| Par ailleurs, pour reprendre ton code: "While Not
EOF(1)"
|
| C'est incompréhensible, on est pas en C avec des trucs
du
| genre "i++", tu pourrais écrire correctement, soit:
| While EOF(pointeur) <> true

Petite précision (déjà signalé, mais il y en a qui sont
bornés):
Utiliser "True" ou "False" dans une expression booléenne
pour une condition est totalement RIDICULE et INUTILE...
Par exemple, ici dans le cas présent, la fonction EOF
retourne déjà True ou False, il n'est pas nécessaire de
recomparer le résultat
à True ou à False! (même pas pour la compréhension du code
!)
La bonne syntaxe est bien "While Not EOF(1)" de Gloops (ou
"Until EOF(1)" mais c'est un autre débat)

Cordialement,
Pascal B.





Avatar
Gloops
Salut,

Essaie juste de mettre en oeuvre ce que tu disais, une lecture du
fichier source pour une lecture du fichier cible, et regarde le résultat.
Avatar
Gloops
Gloops a écrit, le 23/03/2005 11:17 :

Salut,

Essaie juste de mettre en oeuvre ce que tu disais, une lecture du
fichier source pour une lecture du fichier cible, et regarde le résultat.



euh, une lecture du fichier source pour une écriture du fichier cible,
bien sûr.
Avatar
Pascal B.
"LE TROLL"
| (...blabla incompréhensible...) on ne programme pas dans un style mathématique,
| mais linguistique...
|

Justement,
"Tant que Pas Fin-De-Fichier"
est plus proche du parlé naturel que
"Tant que Fin-De-Fichier est faux"

;-)
Pascal B.
Avatar
Gloops
Salut,

Peut-être devrais-tu préciser que le passage à la personne suivante est
marqué par une ligne qui commence par un A, et que les autres codes sont
ignorés, les champs sont pris dans l'ordre de leur arrivée.

Ou bien c'était évident ?
1 2 3 4 5