OVH Cloud OVH Cloud

Import CSV

29 réponses
Avatar
Daniel AUBRY
Bonsoir à tous,

je dois importer un fichier CSV dans une base de données.
D'habitude j'ai des fichiers texte avec enregistrements de
longueur fixe.
Quelqu'un pourrait-il me conseiller sur la (bonne) méthode
à utiliser.

Merci,
Dany

9 réponses

1 2 3
Avatar
Aski
Hi,

En folâtrant sur son clavier, Daniel AUBRY s'est exprimé ainsi :

Peu importe le nom des champs. Je serai déjà bien content
d'avoir un exemple. Tu le fais comme tu veux, c'est à moi de
l'adapter.
Les règles de base de ce fichier sont :
- pas de retour à la ligne
- les champs date encadrés par "" même si vides
- les champs sont séparés par ;

Pour que les choses soient bien clair je colle ci-dessous le début du
fichier, derrière c'est les données confidentielles.

Dossard;Puce;Type inscription;Nom;Prénom;Sexe;Année de naissance;Date
de naissance;Numéro de licence;Fédération;Club;Numéro de club;Comité
entreprise;Adresse;Code postal;Ville;Pays;Téléphone;Fax;Email;Temps
escompté;Handisport;Capitaine;Certificat médical ou Licence;Date dépot
Certificat médical;Etat vérification Certificat médical;Fichier
Certificat médical;Catégorie de prix;Montant du paiement;Type de
paiement;Message paiement;Détail prix options;Nom manifestation;Nom
épreuve;Date
épreuve;Param1;Param2;Param3;Param4;Param5;Param6;Param7;Param8;Param9;Param10;Nom
équipe;Numéro équipe;Param1 équipe;Param2 équipe;Param3 équipe;Ref.
inscription;Date inscription;Décharge acceptée;Règlement accepté;


Le code que je t'ai fait parvenir hier devrait te convenir.
As-tu pu l'adapter ?
Je vois que tu travailles pour une association JS. C'est bien. :-)

Aski
Avatar
Daniel AUBRY
"Aski" a écrit dans le message de news:

Hi,

En folâtrant sur son clavier, Daniel AUBRY s'est exprimé ainsi :

Peu importe le nom des champs. Je serai déjà bien content
d'avoir un exemple. Tu le fais comme tu veux, c'est à moi de
l'adapter.
Les règles de base de ce fichier sont :
- pas de retour à la ligne
- les champs date encadrés par "" même si vides
- les champs sont séparés par ;

Pour que les choses soient bien clair je colle ci-dessous le début du
fichier, derrière c'est les données confidentielles.

Dossard;Puce;Type inscription;Nom;Prénom;Sexe;Année de naissance;Date
de naissance;Numéro de licence;Fédération;Club;Numéro de club;Comité
entreprise;Adresse;Code postal;Ville;Pays;Téléphone;Fax;Email;Temps
escompté;Handisport;Capitaine;Certificat médical ou Licence;Date dépot
Certificat médical;Etat vérification Certificat médical;Fichier
Certificat médical;Catégorie de prix;Montant du paiement;Type de
paiement;Message paiement;Détail prix options;Nom manifestation;Nom
épreuve;Date
épreuve;Param1;Param2;Param3;Param4;Param5;Param6;Param7;Param8;Param9;Param10;Nom
équipe;Numéro équipe;Param1 équipe;Param2 équipe;Param3 équipe;Ref.
inscription;Date inscription;Décharge acceptée;Règlement accepté;


Le code que je t'ai fait parvenir hier devrait te convenir.
As-tu pu l'adapter ?
Je vois que tu travailles pour une association JS. C'est bien. :-)

Aski



Encore pas eu le temps !!!
Ce week-end sans faute.
Je te tiens au courant.

dany
Avatar
Aski
Hi,

En folâtrant sur son clavier, Daniel AUBRY s'est exprimé ainsi :

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




Le code que je t'ai fait parvenir hier devrait te convenir.
As-tu pu l'adapter ?
Je vois que tu travailles pour une association JS. C'est bien. :-)

Aski



Encore pas eu le temps !!!
Ce week-end sans faute.
Je te tiens au courant.

dany



Ok, ayant passé un certain temps sur le sujet, je suis impatient de savoir
si cela t'est utile. ;-)

Aski
Avatar
Daniel AUBRY
"Aski" a écrit dans le message de news:
%
Hi,

En folâtrant sur son clavier, Daniel AUBRY s'est exprimé ainsi :

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




Le code que je t'ai fait parvenir hier devrait te convenir.
As-tu pu l'adapter ?
Je vois que tu travailles pour une association JS. C'est bien. :-)

Aski



Encore pas eu le temps !!!
Ce week-end sans faute.
Je te tiens au courant.

dany



Ok, ayant passé un certain temps sur le sujet, je suis impatient de savoir
si cela t'est utile. ;-)

Aski



Salut Aski,
j'ai testé ton module ce matin et j'ai du le modifier.
Je m'en suis largement inspiré et t'en remercie.
Pour info mon code ci-dessous :

Dim DonneeNet()
NombreChamp = 54

Open NomFichierInternet For Input As #1
Input #1, TextLine
Close #1

CompteFiche = 0
PositionDepart = 0

For i = 1 To Len(TextLine)
If Mid(TextLine, i, 1) = ";" Then
CompteFiche = CompteFiche + 1
ElseIf Asc(Mid(TextLine, i, 1)) = 10 And PositionDepart = 0 Then
PositionDepart = i + 1
End If
Next

NombreFiche = (CompteFiche / NombreChamp) - 1
NombreChamp = NombreChamp - 1

ReDim DonneeNet(NombreChamp)
P1 = PositionDepart

For i = 1 To NombreFiche
For C = 1 To NombreChamp
P2 = InStr(P1 + 1, TextLine, ";")
Texte = Mid(TextLine, P1 + 1, P2 - P1 - 1)

If Texte = """""" Then Texte = ""

If Texte <> "" Then
If Asc(Texte) = 10 Then Texte = "PAS-CHARGER"
End If

If Mid(Texte, 1, 1) = """" Then
Texte = Mid(Texte, 2, Len(Texte) - 2)
End If

If Texte <> "PAS-CHARGER" Then
DonneeNet(C) = Texte
Else
C = C - 1
End If
P1 = P2
Next
ChargeDansGrille
Next
Avatar
Aski
Hugh Daniel AUBRY,

En folâtrant sur ton clavier, tu nous as susurré :

j'ai testé ton module ce matin et j'ai du le modifier.
Je m'en suis largement inspiré et t'en remercie.
Pour info mon code ci-dessous :



Heureux d'avoir pu t'être utile et merci du retour.
On peut constater que tu as pas mal modifié la structure originale de tes
fiches.
Je remarque que tu utilises systématiquement Mid( alors que tu pourrais
prendre Left (ou Right( dans certains cas. Est-ce que Mid est plus rapide ?
Tu pourrais aussi utilement te servir de la fonction Replace.

Aski
Avatar
Jean-Marc
"Aski" a écrit dans le message de
news:%23GFMA$%
Hugh Daniel AUBRY,

En folâtrant sur ton clavier, tu nous as susurré :

> j'ai testé ton module ce matin et j'ai du le modifier.
> Je m'en suis largement inspiré et t'en remercie.
> Pour info mon code ci-dessous :

Heureux d'avoir pu t'être utile et merci du retour.
On peut constater que tu as pas mal modifié la structure originale de tes
fiches.
Je remarque que tu utilises systématiquement Mid( alors que tu pourrais
prendre Left (ou Right( dans certains cas. Est-ce que Mid est plus rapide


?
Tu pourrais aussi utilement te servir de la fonction Replace.



Oui, et dans tous les cas utiliser les versions avec $ :
Mid$, Left$, Right$, etc

Ces fonctions travaillent avec des strings alors que leurs homologues
sans le $ travaillent avec des variants, ce qui est:
- mal
- lent

Il y a aussi moyen d'optimiser fortement le temps de traitement en
plaçant les tests de façon mieux organisé, mais je suppose que le
temps de traitement n'est pas critique.

--
Jean-marc
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;
Avatar
Aski
Hugh Jean-Marc,

En folâtrant sur ton clavier, tu nous as susurré :

"Aski" a écrit dans le message de
news:%23GFMA$%
Hugh Daniel AUBRY,

En folâtrant sur ton clavier, tu nous as susurré :

j'ai testé ton module ce matin et j'ai du le modifier.
Je m'en suis largement inspiré et t'en remercie.
Pour info mon code ci-dessous :



Heureux d'avoir pu t'être utile et merci du retour.
On peut constater que tu as pas mal modifié la structure originale
de tes fiches.
Je remarque que tu utilises systématiquement Mid( alors que tu
pourrais prendre Left (ou Right( dans certains cas. Est-ce que Mid
est plus rapide ? Tu pourrais aussi utilement te servir de la
fonction Replace.



Oui, et dans tous les cas utiliser les versions avec $ :
Mid$, Left$, Right$, etc

Ces fonctions travaillent avec des strings alors que leurs homologues
sans le $ travaillent avec des variants, ce qui est:
- mal
- lent

Il y a aussi moyen d'optimiser fortement le temps de traitement en
plaçant les tests de façon mieux organisé, mais je suppose que le
temps de traitement n'est pas critique.



Merci Jean-Marc pour le complément.

J'avais oublié de dire que dans l'expression
For i = 1 To Len(TextLine)
Len(TextLine) est recalculé à chaque boucle.

Il est préférable d'écrire
lenTextLine = Len(TextLine)
For i = 1 To lenTextLine

Aski
Avatar
Daniel AUBRY
"Aski" a écrit dans le message de news:

Hugh Jean-Marc,

En folâtrant sur ton clavier, tu nous as susurré :

"Aski" a écrit dans le message de
news:%23GFMA$%
Hugh Daniel AUBRY,

En folâtrant sur ton clavier, tu nous as susurré :

j'ai testé ton module ce matin et j'ai du le modifier.
Je m'en suis largement inspiré et t'en remercie.
Pour info mon code ci-dessous :



Heureux d'avoir pu t'être utile et merci du retour.
On peut constater que tu as pas mal modifié la structure originale
de tes fiches.
Je remarque que tu utilises systématiquement Mid( alors que tu
pourrais prendre Left (ou Right( dans certains cas. Est-ce que Mid
est plus rapide ? Tu pourrais aussi utilement te servir de la
fonction Replace.



Oui, et dans tous les cas utiliser les versions avec $ :
Mid$, Left$, Right$, etc

Ces fonctions travaillent avec des strings alors que leurs homologues
sans le $ travaillent avec des variants, ce qui est:
- mal
- lent

Il y a aussi moyen d'optimiser fortement le temps de traitement en
plaçant les tests de façon mieux organisé, mais je suppose que le
temps de traitement n'est pas critique.



Merci Jean-Marc pour le complément.

J'avais oublié de dire que dans l'expression
For i = 1 To Len(TextLine)
Len(TextLine) est recalculé à chaque boucle.

Il est préférable d'écrire
lenTextLine = Len(TextLine)
For i = 1 To lenTextLine

Aski





Effectivement, je vais modifier.

Par contre chaque fichier contient moins de 50 fiches ce
qui me fait un temps de traitement de1 à 2 secondes par fichier.
Peinard !!!

Dany
Avatar
Aski
Hugh Daniel AUBRY,

En folâtrant sur ton clavier, tu nous as susurré :

Effectivement, je vais modifier.

Par contre chaque fichier contient moins de 50 fiches ce
qui me fait un temps de traitement de1 à 2 secondes par fichier.
Peinard !!!

Dany



Nous sommes tous d'accord avec toi. On chipote ;-)
Mais autant prendre de bonnes habitudes pour tes futurs longs programmes.
:-)

Aski
1 2 3