OVH Cloud OVH Cloud

Vos conseils sur l'importation d'un fichier texte non délimité

7 réponses
Avatar
tostaky77
Bonjour,=20

afin de ne pas partir tout azimut, je recherche des=20
conseils sur la lecture d'un fichier texte pour=20
int=E9gration dans une table.
je m'explique:

J'ai un fichier texte (fichier d'impression) qui contient=20
des bons de pr=E9parations (adresse client, n=B0 de=20
colis, ...lignes de commande, ...).
J'ai besoin de r=E9cup=E9rer les lignes de commande pour les=20
int=E9grer dans une table (ainsi que quelques infos=20
suppl=E9mentaire).=20
Mon besoin n'est pas ponctuel car je dois int=E9grer des=20
fichiers "au fil de l'eau" (ce qui explique que je=20
souhaite faire une applic au minimun automatis=E9e.
Un fichier peut atteindre 60 000 lignes =E0 int=E9grer (donc=20
peut contenir 100 000 lignes si on compte les infos=20
superflues telles que les adresses,les lignes vides, ...).

Si vous avez des id=E9es, des liens ou infos pouvant=20
m'aiguiller vers une solution r=E9aliste.
Personnellement, j'aurais souhait=E9 faire =E7a sous excel,=20
faire un macro sous xls puis l'appeler/executer =E0 travers=20
Access, mais la volum=E9trie des fichiers et les temps de=20
traitements m'interpellent.
Voila .

7 réponses

Avatar
Pierre Jagut
Bonjour,

Cela me semble assez facile, mais il faut adapter le code que t'a donné
anor, car tu as en fait 2 tables dans ton fichier : une table "Commande" et
une table "Article".
Champs de la table "Commande" (dans l'ordre d'apparition) :
- Nom_Prénom
- Adresse1
- Adresse2 (il n'y en a pas dans tes exemples, mais prévois d'en avoir :
test sur le code postal)
- CodePostal
- Ville
- Num_Client
- Num_Commande
- NbArticles
- PoidsCommande
Champs de la table "Articles"
- Num_Commande
- Gare
- Gisement
- Code_Article
- Quantité

La grammaire de lecture des lignes du fichier texte semble être a peu près
celle-ci :

- Ligne(s) vide(s) (1 seule ?)
- Nom_Prénom
- Adresse1
- Si pas 5 numériques à gauche : Adresse 2
- CodePostal sur 5, un blanc, puis Ville
- Ligne(s) vide(s) (1 ?)
- "N°DE CLIENT: ", puis Num_Client
- " N°de commande: ", puis Num_Commande
- Ligne(s) vide(s) (1 ?)
- "GARE GISEMENT CODE ARTICLE QUANTITE"
- Ligne(s) vide(s) (1 ?)
- Tant que pas ligne vide
- Gare (3 car), 6 blanc, Gisement (6 car), 7 blancs, Code_Article (6 car),
1 blanc, Quantité (10 car)
- Ajouter un enregistrement "Articles"
- Ligne(s) vide(s) (1 ?)
- "Nb d'articles commandés: ", puis NbArticles
- "Poids de la commande: ", puis Poids suivi de " kg"
- Ajouter un enregistrement "Commande".

Remarque :
Il faudra découblonner ta table "Commande" sur le N° de client car un même
client peut avoir plusieurs commandes.

Je vais essayer d'adapter le code d'Anor (il faudra vérifier) :

Sub ImportZMMSPA()

Dim txtLine As String
Dim LigneVide as String
Dim LeFichier As String
Dim dbs As DAO.Database
Dim rstCommandes As DAO.Recordset
Dim rstArticles As DAO.Recordset

Dim Nom_Prenom as string, Adresse1 as string, Adresse2 as string, CodePostal
as string
Dim Ville as string, Num_Client as string, Num_Commande as string,
NbArticles as integrer
Dim poids as integer, txtTampon as string, boolNum as integer, i as interger

LeFichier = "c:cheminfichier.txt"
LigneVide="" ' ou " " selon le contenu réel d'une ligne vide

Set dbs = CurrentDb
Set rstCommandes = dbs.OpenRecordset("Commande", dbOpenDynaset)
Set rstArticles = dbs.OpenRecordset("Articles", dbOpenDynaset)

Close #1 'par sécurité
txtLine=LigneVide

Open LeFichier For Input As #1
Do While not EOF(1)
Do While (txtLine=LigneVide and (not EOF(1)))
Line Input #1, txtLine
Loop
Nom_Prenom = txtLine
Line Input #1, txtLine
Adresse1 = txtLine
Line Input #1, txtLine
BoolNum=1 ' BoolNum=1 si CodePostal (5 numériques)
For i=1 to 5
txtTampon=mid(txtLine,i,1)
if (txtTampon < "0") or (txtTampon > "0") then BoolNum=0
Next i
' Remarque : je ne connais pas la fonction "IsNumeric", mais elle
pourrait simplifier cette partie
if BoolNum=1 then
Adresse1 = txtLine
Line Input #1, txtLine
end if
Codepostal = mid(txtLine, 1, 5)
Ville = mid(txtLine, 7, 50)
Line Input #1, txtLine
Do While (txtLine=LigneVide and (not EOF(1)))
Line Input #1, txtLine
Loop
if mid(txtLine,1,14)="N°DE CLIENT: " then
NumClient=mid(txtLine,15,10)
end if
Line Input #1, txtLine
if mid(txtLine,1,18)=" N°de commande: " then
NumCommande=mid(txtLine,15,10)
end if
Line Input #1, txtLine
Do While (txtLine=LigneVide and (not EOF(1)))
Line Input #1, txtLine
Loop
if txtLine="GARE GISEMENT CODE ARTICLE QUANTITE" then
Line Input #1, txtLine
Do While (txtLine=LigneVide and (not EOF(1)))
Line Input #1, txtLine
Loop
Do While (txtLine=LigneVide and (not EOF(1)))
With rstArticles
.AddNew
.Fields("Gare").Value = Mid(txtLine, 1, 4)
.Fields("Gisement").Value = Mid(txtLine, 10, 6)
.Fields("CodeArticle").Value = Mid(txtLine, 23, 4)
.Fields("Quantite").Value = Cint(Mid(txtLine, 30, 10))
.Update
end with
Line Input #1, txtLine
Loop
end if
Do While (txtLine=LigneVide and (not EOF(1)))
Line Input #1, txtLine
Loop
if mid(txtLine,1,25)="Nb d'articles commandés: " then
NbArticles=Cint(mid(txtLine,26,10))
end if
Line Input #1, txtLine
if mid(txtLine,1,22)="Poids de la commande: " then
txtTampon=Cint(mid(txtLine,23,10))
Poids=Cint(mid(txtTampon,1,len(txtTampon)-3)) ' pour enlever " kg" à
la fin
end if
With rstCommandes
.AddNew
.Fields("Nom_Prenom").Value = Nom_Prenom
'... idem pour tous les champs
.Update
end with
if not EOF(1) then Line Input #1, txtLine
Loop

Close #1
rstCommandes.Close
rstArticles.Close
Set dbs = Nothing
Set rstCommandes = Nothing
Set rstArticles = Nothing

End Sub

Je ne suis pas sûr de tout le code. Il faut notamment vérifier les fautes de
frappe et d'orthographe. Mais le principal y est. Je je suis pas sûr de la
fonction Cint (transformation caractère -> numérique). On peut probablement
optimiser le test de code postal avec la fonction IsNumerique qu'Anor
utilise. Pour enlever " kg" à la fin du poids, il faut peut-être enlever les
blancs avant (fonction trim ?). Bref, il reste à ajuster...

Enfin, je pense que tu devrais séparer les informations Clients des
informations Commandes (faire deux tables, en ne conservant dans Commandes
que le Num_Client), et en dédoublonnant la table Clients (par requête sur le
num_client). Mais c'est à toi de voir.

Pour terminer, il n'y a pas la date (de commande, d'expédition, etc.) dans
ces fichiers. A mon avis, il serait intéressant de conserver une trace au
moins de la date de traitement ou de la date du fichier.

J'espère que tout cela va t'aider.
Pierre.


a écrit dans le message de
news:02a601c35d28$f858a5a0$
Merci de ta réponse
mes colones ne sont pas parfaitement alignées
Ci-joint 1 exemple de mon fichier hyper simplifé

1 fichier = x bp (bon de préparations)
1 bp = plusieurs infos de natures différentes
les infos de natures différentes sont alignées
différement, mais alignées de la même facon d'un bp
à l'autre.

***** début du fichier


DUPOND MICHEL
5 RUE DES MARCHANDS
01234 VILLE NOUVELLE

N°DE CLIENT: 00199
N°de commande: 0905

GARE GISEMENT CODE ARTICLE QUANTITE

H01 H01482 A25689 1
H02 H02482 A25685 1
H03 H03482 A25689 1
H03 H03082 A25689 1

Nb d'articles commandés: 4
Poids de la commande: 1 kg

MICHEL MARCEL
5 RUE DES POISSONIERS
01234 VILLE ANCIENNE

N°DE CLIENT: 00257
N°de commande: 0905

GARE GISEMENT CODE ARTICLE QUANTITE

H01 H01482 A25689 1
H02 H02482 A25685 1
H03 H03482 A25689 1
H03 H03082 A25689 1
H20 H03082 A25689 1

Nb d'articles commandés: 5
Poids de la commande: 1 kg


DUPOND MICHEL
5 RUE DES MARCHANDS
01234 VILLE NOUVELLE

N°DE CLIENT: 00199
N°de commande: 1999

GARE GISEMENT CODE ARTICLE QUANTITE

H01 H01482 A25689 1
H02 H02482 A25685 1


Nb d'articles commandés: 2
Poids de la commande: 1 kg


***** fin du fichier

autrement dit faut que je detecte des chaines de
caractères alignées dans un ordre trés précis
puis aprés zou ..
a ton avis c'est faisable facilement ?


Mon traitement doit aboutir sur une table similaire à la
suivante


N de cde GARE GISEMENT CODE ARTICLE QUANTITE.
.... .. ...... ........ ....
..... .. ...... ........ ....
..... .. ...... ........ ....
Avatar
Pierre Jagut
PS : dans le code précédent que je te donne, je n'ai pas traité les "erreurs
de grammaire", c'est à dire les cas où la structure des informations ne suit
pas celle que j'ai supposée. Par exemple, j'ai mis des "If ... then" sans
"Else". Il faurdait donc avant s'assurer que la grammaire est bonne et ne
peut pas varier. En général, elle ne varie pas sur ce type de fichier généré
automatiquement. Mais si un jour le programmeur qui est responsable du code
de l'édition change l'ordre ou quelque chose, il faudrait au moins mettre
une alerte.

Pierre.
Avatar
Anor
Bonjour Pierre,

Merci d'avoir pris le relais, je ne me sentais pas le courage de décortiquer le fichier ;-)
Je pense qu'avec ce que tu as entamé, "tostaky" a maintenant de quoi pour avancer.

--
à+
Arnaud
--------------------------------------------------
Conseils d'utilisation, sites recommandés :
http://users.skynet.be/mpfa/
Access Memorandum - http://memoaccess.free.fr
--------------------------------------------------

Pierre Jagut :
| PS : dans le code précédent que je te donne, je n'ai pas traité les
| "erreurs de grammaire", c'est à dire les cas où la structure des
| informations ne suit pas celle que j'ai supposée. Par exemple, j'ai
| mis des "If ... then" sans "Else". Il faurdait donc avant s'assurer
| que la grammaire est bonne et ne peut pas varier. En général, elle ne
| varie pas sur ce type de fichier généré automatiquement. Mais si un
| jour le programmeur qui est responsable du code de l'édition change
| l'ordre ou quelque chose, il faudrait au moins mettre une alerte.
|
| Pierre.
Avatar
Pierre Jagut
Bonjour Anor,

Merci surtout à toi pour toutes les réponses et conseils que tu donnes. Et
merci aussi à tous les autres.
Je suis loin d'être un expert : je suis ce NG pour y trouver des trucs que
je pourrai utiliser. Quand je peux répondre, je m'y mets, mais c'est assez
rare , ou qlq1 a déjà répondu.

Pour moi, c'est les vacances ce soir... ouf !

Pierre.

"Anor" <http://minilien.com/?8RfQLiXHOe> a écrit dans le message de
news:
Bonjour Pierre,

Merci d'avoir pris le relais, je ne me sentais pas le courage de
décortiquer le fichier ;-)

Je pense qu'avec ce que tu as entamé, "tostaky" a maintenant de quoi pour
avancer.


--
à+
Arnaud
--------------------------------------------------
Conseils d'utilisation, sites recommandés :
http://users.skynet.be/mpfa/
Access Memorandum - http://memoaccess.free.fr
--------------------------------------------------

Pierre Jagut :
| PS : dans le code précédent que je te donne, je n'ai pas traité les
| "erreurs de grammaire", c'est à dire les cas où la structure des
| informations ne suit pas celle que j'ai supposée. Par exemple, j'ai
| mis des "If ... then" sans "Else". Il faurdait donc avant s'assurer
| que la grammaire est bonne et ne peut pas varier. En général, elle ne
| varie pas sur ce type de fichier généré automatiquement. Mais si un
| jour le programmeur qui est responsable du code de l'édition change
| l'ordre ou quelque chose, il faudrait au moins mettre une alerte.
|
| Pierre.




Avatar
Anor
Bonjour

:

| Pour info ceci est destiné à une application RF.

Réseau Ferré ?

--
à+
Arnaud
--------------------------------------------------
Conseils d'utilisation, sites recommandés :
http://users.skynet.be/mpfa/
Access Memorandum - http://memoaccess.free.fr
--------------------------------------------------
Avatar
RF: radio fréquence -> terminaux portables radio fréquence.
le tout chez un prestataire logistique.

-----Message d'origine-----
Bonjour

:

| Pour info ceci est destiné à une application RF.

Réseau Ferré ?

--
à+
Arnaud
--------------------------------------------------
Conseils d'utilisation, sites recommandés :
http://users.skynet.be/mpfa/
Access Memorandum - http://memoaccess.free.fr
--------------------------------------------------


.



Avatar
RF: radio fréquence -> terminaux portables radio fréquence.
le tout chez un prestataire logistique.

-----Message d'origine-----
Bonjour

:

| Pour info ceci est destiné à une application RF.

Réseau Ferré ?

--
à+
Arnaud
--------------------------------------------------
Conseils d'utilisation, sites recommandés :
http://users.skynet.be/mpfa/
Access Memorandum - http://memoaccess.free.fr
--------------------------------------------------


.