OVH Cloud OVH Cloud

Découpage de fichier texte

11 réponses
Avatar
fleguen
Bonjour =E0 tous,

Je dois alimenter une Base de donn=E9es =E0 partir d'un fichier texte.
Mon fichier en entr=E9e contient des codes sur les 4 premiers
caract=E8res puis les caract=E8res qui suivent sont fonction de la valeur
du code et bien s=FBr, selon la valeur du code, la structure des
donn=E9es n'est pas la m=EAme.

Exemple :
0000xxxxttttttttrrr
1111yyyyyyypp
0000qqqqaaaaaaaauuu
2222sssseee
Donc si mon code est 0000, j'ai une premi=E8re donn=E9e sur 4 caract=E8res
puis une autre sur 8 et enfin une troisi=E8me sur 3
Si mon code est 1111, j'ai une premi=E8re donn=E9e sur 7 et une seconde
sur 2.

L'objectif de mon programme, c'est de cr=E9er un fichier en sortie qui
contienne une structure homog=E8ne.
0000xxxxtttttttrrr
1111 yyyyyyypp
0000qqqqaaaaaaaauuu
2222ssss ee

Avec un tel fichier, il est tr=E8s facile d'alimenter une base de
donn=E9e.

Je pensais concevoir un programme qui utilise le principe des Close
Copy du COBOL pour r=E9soudre simplement mon pb mais visible =E7a n'est
pas possible en VB.
Quelqu'un aurait-il une id=E9e autre qu'une succesion de Mid(chaine, x,
y) ?

Merci d'avance

10 réponses

1 2
Avatar
Gloops
Bonjour,

Cherche du côté des types de données utilisateur. Dans MSDN, il faut
chercher Type dans l'index, si tu le cherches dans le sommaire tu es
noyé dans les hors sujet. Après tu affiches l'instruction Type.

Exemple :

Private Type EnrA
Z1 As String * 4
Z2 As String * 4
Z3 As String * 8
Z4 As String * 3
End Type

Dim Ligne1 As EnrA

Select Case Left$(Ligne, 4)
Case "0000"
Ligne1 = Ligne 'initialisation

Ligne1.Z1 '= code de type d'enregistrement
Ligne1.Z2 '= premier champ utile
Ligne2.Z3 '= champ suivant
'...
Case "1111"
'...
________________________________________________
a écrit, le 26/10/2005 13:17 :

Bonjour à tous,

Je dois alimenter une Base de données à partir d'un fichier texte.
Mon fichier en entrée contient des codes sur les 4 premiers
caractères puis les caractères qui suivent sont fonction de la valeur
du code et bien sûr, selon la valeur du code, la structure des
données n'est pas la même.

Exemple :
0000xxxxttttttttrrr
1111yyyyyyypp
0000qqqqaaaaaaaauuu
2222sssseee
Donc si mon code est 0000, j'ai une première donnée sur 4 caractères
puis une autre sur 8 et enfin une troisième sur 3
Si mon code est 1111, j'ai une première donnée sur 7 et une seconde
sur 2.

L'objectif de mon programme, c'est de créer un fichier en sortie qui
contienne une structure homogène.
0000xxxxtttttttrrr
1111 yyyyyyypp
0000qqqqaaaaaaaauuu
2222ssss ee

Avec un tel fichier, il est très facile d'alimenter une base de
donnée.

Je pensais concevoir un programme qui utilise le principe des Close
Copy du COBOL pour résoudre simplement mon pb mais visible ça n'est
pas possible en VB.
Quelqu'un aurait-il une idée autre qu'une succesion de Mid(chaine, x,
y) ?

Merci d'avance



Avatar
Tschuß
Je suis d'accord sur le principe mais avec ce genre d'écriture, je
n'arrive pas à utiliser le type que j'ai défini pour enregistrer mon
fichier en sortie. L'écriture Print #2, EnrA ne fonctionne pas.
Avatar
patrick
Bonjour,
L'écriture Print #2, EnrA ne fonctionne pas.

si tu utilises le principe de Gloops :
Print #2, Ligne1 comme instruction
EnrA est le Type

@+

patrick




"Gloops" a écrit dans le message news:
435f6f42$0$7843$
Bonjour,

Cherche du côté des types de données utilisateur. Dans MSDN, il faut
chercher Type dans l'index, si tu le cherches dans le sommaire tu es
noyé dans les hors sujet. Après tu affiches l'instruction Type.

Exemple :

Private Type EnrA
Z1 As String * 4
Z2 As String * 4
Z3 As String * 8
Z4 As String * 3
End Type

Dim Ligne1 As EnrA

Select Case Left$(Ligne, 4)
Case "0000"
Ligne1 = Ligne 'initialisation

Ligne1.Z1 '= code de type d'enregistrement
Ligne1.Z2 '= premier champ utile
Ligne2.Z3 '= champ suivant
'...
Case "1111"
'...
________________________________________________
a écrit, le 26/10/2005 13:17 :

> Bonjour à tous,
>
> Je dois alimenter une Base de données à partir d'un fichier texte.
> Mon fichier en entrée contient des codes sur les 4 premiers
> caractères puis les caractères qui suivent sont fonction de la valeur
> du code et bien sûr, selon la valeur du code, la structure des
> données n'est pas la même.
>
> Exemple :
> 0000xxxxttttttttrrr
> 1111yyyyyyypp
> 0000qqqqaaaaaaaauuu
> 2222sssseee
> Donc si mon code est 0000, j'ai une première donnée sur 4 caractères
> puis une autre sur 8 et enfin une troisième sur 3
> Si mon code est 1111, j'ai une première donnée sur 7 et une seconde
> sur 2.
>
> L'objectif de mon programme, c'est de créer un fichier en sortie qui
> contienne une structure homogène.
> 0000xxxxtttttttrrr
> 1111 yyyyyyypp
> 0000qqqqaaaaaaaauuu
> 2222ssss ee
>
> Avec un tel fichier, il est très facile d'alimenter une base de
> donnée.
>
> Je pensais concevoir un programme qui utilise le principe des Close
> Copy du COBOL pour résoudre simplement mon pb mais visible ça n'est
> pas possible en VB.
> Quelqu'un aurait-il une idée autre qu'une succesion de Mid(chaine, x,
> y) ?
>
> Merci d'avance
>



Avatar
patrick
Sorry erreur de ma part j'ai répondu trop vite



"patrick" a écrit dans le message news:
435f7bd3$
Bonjour,
L'écriture Print #2, EnrA ne fonctionne pas.

si tu utilises le principe de Gloops :
Print #2, Ligne1 comme instruction
EnrA est le Type

@+

patrick




"Gloops" a écrit dans le message news:
435f6f42$0$7843$
> Bonjour,
>
> Cherche du côté des types de données utilisateur. Dans MSDN, il faut
> chercher Type dans l'index, si tu le cherches dans le sommaire tu es
> noyé dans les hors sujet. Après tu affiches l'instruction Type.
>
> Exemple :
>
> Private Type EnrA
> Z1 As String * 4
> Z2 As String * 4
> Z3 As String * 8
> Z4 As String * 3
> End Type
>
> Dim Ligne1 As EnrA
>
> Select Case Left$(Ligne, 4)
> Case "0000"
> Ligne1 = Ligne 'initialisation
>
> Ligne1.Z1 '= code de type d'enregistrement
> Ligne1.Z2 '= premier champ utile
> Ligne2.Z3 '= champ suivant
> '...
> Case "1111"
> '...
> ________________________________________________
> a écrit, le 26/10/2005 13:17 :
>
> > Bonjour à tous,
> >
> > Je dois alimenter une Base de données à partir d'un fichier texte.
> > Mon fichier en entrée contient des codes sur les 4 premiers
> > caractères puis les caractères qui suivent sont fonction de la valeur
> > du code et bien sûr, selon la valeur du code, la structure des
> > données n'est pas la même.
> >
> > Exemple :
> > 0000xxxxttttttttrrr
> > 1111yyyyyyypp
> > 0000qqqqaaaaaaaauuu
> > 2222sssseee
> > Donc si mon code est 0000, j'ai une première donnée sur 4 caractères
> > puis une autre sur 8 et enfin une troisième sur 3
> > Si mon code est 1111, j'ai une première donnée sur 7 et une seconde
> > sur 2.
> >
> > L'objectif de mon programme, c'est de créer un fichier en sortie qui
> > contienne une structure homogène.
> > 0000xxxxtttttttrrr
> > 1111 yyyyyyypp
> > 0000qqqqaaaaaaaauuu
> > 2222ssss ee
> >
> > Avec un tel fichier, il est très facile d'alimenter une base de
> > donnée.
> >
> > Je pensais concevoir un programme qui utilise le principe des Close
> > Copy du COBOL pour résoudre simplement mon pb mais visible ça n'est
> > pas possible en VB.
> > Quelqu'un aurait-il une idée autre qu'une succesion de Mid(chaine, x,
> > y) ?
> >
> > Merci d'avance
> >
>




Avatar
Tschuß
J'ai également essayé mais ça ne fonctionne pas mieux.
Je me demande comment je dois ouvrir mon fichier en entrée. Je pense
que j'ai un pb à ce niveau
Avatar
patrick
RE

tu mets ligne1.z1 à ligne1.z4 dans une ligne
puis tu l'ecris
LigneSortie = ligne1.Z1 & ligne1.Z2 & ligne1.Z3 & ligne1.Z4
Print #2, LigneSortie

@+
patrick

"Tschuß" a écrit dans le message news:

Je suis d'accord sur le principe mais avec ce genre d'écriture, je
n'arrive pas à utiliser le type que j'ai défini pour enregistrer mon
fichier en sortie. L'écriture Print #2, EnrA ne fonctionne pas.
Avatar
Gloops
Bon, eh bien je dois avouer que j'ai bêtement récité la "question de
cours" ...

A la mise en pratique il semble manquer un maillon.

J'ai bien essayé d'utiliser CopyMemory, mais apparemment pas avec la
bonne syntaxe.

Question à creuser.
Avatar
Tschuß
Effectivement le pb n'est pas aussi simple qu'il n'y parait.
J'ai trouvé ce post qui semble répondre au besoin mais la je me
heurte à un pb de longueur de fichier
http://groups.google.com/group/comp.lang.basic.visual/browse_frm/thread/23d 4783fe67166cc/8a8efa99df9f95f0?lnk=st&q=Type+file+text+output+structure +VB&rnum%#8a8efa99df9f95f0

Dans mon fichier de sortie, mes enregistrements sont collés les uns
derrière les autres sans une fin de ligne.
Normalement, avec une longueur fixe ça devrait ne pas se produire.
Avatar
Gloops
Ah, oui, avec Get et Put ... fallait y penser, à ceux-là. Un peu normal,
avec put, d'avoir tout bout-à-bout, en principe c'est destiné à un
fichier à accès direct, pour ça qu'on n'y avait pas pensé.

Si on veut éviter ça, une direction de recherche peut être d'avoir un
dernier champ de deux caractères à la fin de chaque enregistrement, dans
lequel on écrit vbCrLf. Si je compte bien, dans l'exemple que j'avais pris
Private Type EnrA
Z1 As String * 4
Z2 As String * 4
Z3 As String * 8
Z4 As String * 3
End Type

ça nous fera des enregistrements de 21 caractères (19 pour EnrA, plus
2 pour vbCrLf = Chr$(13) + Chr$(10)). En effet, dans un fichier texte on
ne compte pas les caractères de fin de ligne dans la longueur
d'enregistrement, alors que dans un fichier à accès direct si.

Reste à bien trouver la bonne syntaxe.

Au fait, dans l'exemple que tu mentionnes, les champs sont transférés
dans l'ordre dans lequel ils sont lus si je ne m'abuse, mais au moins si
on réussit à écrire une structure dans le fichier, l'initialiser avant
ne devrait pas poser de problème majeur (enfin là encore, je n'ai pas
testé ...).

J'imagine qu'il y a encore un peu de boulot, là-dessus, avant que ça tourne.
_____________________________________
Tschuß a écrit, le 26/10/2005 16:03 :

Effectivement le pb n'est pas aussi simple qu'il n'y parait.
J'ai trouvé ce post qui semble répondre au besoin mais la je me
heurte à un pb de longueur de fichier
http://groups.google.com/group/comp.lang.basic.visual/browse_frm/thread/23d4783fe67166cc/8a8efa99df9f95f0?lnk=st&q=Type+file+text+output+structure+VB&rnum%#8a8efa99df9f95f0

Dans mon fichier de sortie, mes enregistrements sont collés les uns
derrière les autres sans une fin de ligne.
Normalement, avec une longueur fixe ça devrait ne pas se produire.



Avatar
Tschuß
Bon, sans être une bille en coding, j'avoue que les accès direct dans
un fichier texte, ça ne me dit rien. Les seuls foiqs que j'ai entendu
parler d'accès direct dans un fichier c'était du temps ou je bossais
sur des fichiers VSAM en COBOL.
Bref, si on peut m'en dire plus, je suis preneur.
Par contre, je n'ai pas compris comment terminer ma ligne par Chr$(13)
+ Chr$(10) ? Il suffit de mettre des 2 valeurs systématiquement en fin
de record et ça suffit ?

Bref, si quelqu'un peut me donner des adresses oueb on je peux
m'instruire sur le sujet, je suis preneur.
1 2