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

10 réponses

1 2 3
Avatar
Jean-Marc
"Aski" a écrit dans le message de
news:Ou$
En folâtrant sur son clavier, Jean-Marc s'est exprimé ainsi :

> "Daniel AUBRY" a écrit dans le message de
> news:42e79f07$0$29802$
>> Je confirme :
>> un fichier CSV à la norme serait comme ceci :
>>
>> Nom;Prenom;Age;Ville
>> Dupond;Jean;58;Marseille
>> Robin;;47;Paris
>> Etienne;Régis;45;Lourdes
>>
>> le mien est comme cela : (tout sur la même ligne avec 54 champs)
>>
>>
>


Nom;Prenom;Age;Ville;Dupond;Jean;58;Marseille;Robin;;47;Paris;Etienne;Régis;
> 45;Lourdes
>>
>> Ce sont des fichiers provenant d'un site Internet ou des sprotifs
>> peuvent faire des inscriptions en ligne. On télécharge ces fichiers
>> pour l'application chronométrage.
>
> Re,
>
> Tu peux donc utiliser la méthode que j'indiquais dans un post
> précédent. Si tu veux un mini exemple, je peux faire cela.

J'ai un exemple, mais il faut que je l'adapte.
Si tu n'as rien de fait, je peux adapter mon code et le publier.



Hello,

non rien de fait, donc tu peux y aller :-)

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

En folâtrant sur son clavier, Jean-Marc s'est exprimé ainsi :

"Aski" a écrit dans le message de
news:Ou$
En folâtrant sur son clavier, Jean-Marc s'est exprimé ainsi :

"Daniel AUBRY" a écrit dans le message de
news:42e79f07$0$29802$
Je confirme :
un fichier CSV à la norme serait comme ceci :

Nom;Prenom;Age;Ville
Dupond;Jean;58;Marseille
Robin;;47;Paris
Etienne;Régis;45;Lourdes

le mien est comme cela : (tout sur la même ligne avec 54 champs)









Nom;Prenom;Age;Ville;Dupond;Jean;58;Marseille;Robin;;47;Paris;Etienne;Régis;
45;Lourdes

Ce sont des fichiers provenant d'un site Internet ou des sprotifs
peuvent faire des inscriptions en ligne. On télécharge ces fichiers
pour l'application chronométrage.



Re,

Tu peux donc utiliser la méthode que j'indiquais dans un post
précédent. Si tu veux un mini exemple, je peux faire cela.



J'ai un exemple, mais il faut que je l'adapte.
Si tu n'as rien de fait, je peux adapter mon code et le publier.



Hello,

non rien de fait, donc tu peux y aller :-)



OK, je m'y attelle.
Je prends
"Nom;Prenom;Age;Ville;Dupond;Jean;58;Marseille;Robin;;47;Paris;Etienne;Régis;45;Lourdes"
pour chacune des lignes
Délai : demain

Aski
Avatar
Jean-Marc
"Aski" a écrit dans le message de
news:e3R%
Hi,

En folâtrant sur son clavier, Jean-Marc s'est exprimé ainsi :

> "Aski" a écrit dans le message de
> news:Ou$
>> En folâtrant sur son clavier, Jean-Marc s'est exprimé ainsi :
>>
OK, je m'y attelle.
Je prends



"Nom;Prenom;Age;Ville;Dupond;Jean;58;Marseille;Robin;;47;Paris;Etienne;Régis
;45;Lourdes"
pour chacune des lignes



Attention, une des contraintes est qu'en fait il n'y a qu'une seule
"ligne". Ses données sont toutes d'un bloc, les enregistrements ne sont
pas séparés par un CRLF, mais tous à la suite des autres.

Je suppose que le début "Nom;Prenom;Age;Ville" n'est présent qu'une
fois et peut être simplement ignoré, ou à la rigueur utilisé pour créer
dynamiquement une table en utilisant les libellés comme nom de champ.
Ca sera "bof", car on ne connait pas le type, on pourrait supposer
qu'on met en tout en CHAR(255) et que ça ira comme ça. De même, rien ne
nous dit ou s'arrête la description des libellés des champs et ou
commencent les données. On pourra supposer que c'est un paramètre
quelque part, et que dans notre exemple il vaut 4.

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

En folâtrant sur son clavier, Jean-Marc s'est exprimé ainsi :

"Aski" a écrit dans le message de
news:e3R%
Hi,

En folâtrant sur son clavier, Jean-Marc s'est exprimé ainsi :

"Aski" a écrit dans le message de
news:Ou$
En folâtrant sur son clavier, Jean-Marc s'est exprimé ainsi :





OK, je m'y attelle.
Je prends



"Nom;Prenom;Age;Ville;Dupond;Jean;58;Marseille;Robin;;47;Paris;Etienne;Régis
;45;Lourdes"
pour chacune des lignes



Attention, une des contraintes est qu'en fait il n'y a qu'une
seule "ligne".



J'attendais ta réaction et c'est pour cela que j'ai 'posé' le problème.
J'avais effacé le reste de la discussion ...

Ses données sont toutes d'un bloc, les
enregistrements ne sont pas séparés par un CRLF, mais tous à la suite
des autres.



C"est encore plus facile

Je suppose que le début "Nom;Prenom;Age;Ville" n'est présent
qu'une fois et peut être simplement ignoré, ou à la rigueur utilisé
pour créer dynamiquement une table en utilisant les libellés comme
nom de champ. Ca sera "bof", car on ne connait pas le type, on
pourrait supposer qu'on met en tout en CHAR(255) et que ça ira comme
ça. De même, rien ne nous dit ou s'arrête la description des
libellés des champs et ou commencent les données. On pourra
supposer que c'est un paramètre quelque part, et que dans notre
exemple il vaut 4.



Je vais lire la ligne d'exemple dans un fichier texte terminé par FileEnd =
Char(255). comme tu le suggères.
Mais de toutes façons l'absence de ';' déterminera la fin de la lecture et
le dernier enregistrement.
J'utiliserai un tableau dynamique de 'Records'.

Is it Ok ?

Aski
Avatar
Jean-Marc
"Aski" a écrit dans le message de
news:
Hi Jean-Marc,

En folâtrant sur son clavier, Jean-Marc s'est exprimé ainsi :

> Je suppose que le début "Nom;Prenom;Age;Ville" n'est présent
> qu'une fois et peut être simplement ignoré, ou à la rigueur utilisé
> pour créer dynamiquement une table en utilisant les libellés comme
> nom de champ. Ca sera "bof", car on ne connait pas le type, on
> pourrait supposer qu'on met en tout en CHAR(255) et que ça ira comme
> ça. De même, rien ne nous dit ou s'arrête la description des
> libellés des champs et ou commencent les données. On pourra
> supposer que c'est un paramètre quelque part, et que dans notre
> exemple il vaut 4.



Je vais lire la ligne d'exemple dans un fichier texte terminé par FileEnd


> Char(255). comme tu le suggères.
Mais de toutes façons l'absence de ';' déterminera la fin de la lecture et
le dernier enregistrement.




Non non, je voulais juste dire qu'en l'absence d'indication du TYPE des
données,
on peut décider que tous les champs seront de type STRING (CHAR OU VARCHAR
selon la base utilisée), d'un taliie de 255 caractères.

J'utiliserai un tableau dynamique de 'Records'.
Is it Ok ?



Pour moi c'est très bien, ça doit répondre au besoin de Daniel, en tout
cas pour un exemple.

--
Jean-marc
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;
Avatar
Daniel AUBRY
Je vous remercie de vous décarcasser pour moi.
Je vous aurait bien mis mon fichier en téléchargement
mais il contient des données confidentielles.
L'exemple de fichier que j'ai posté précédement est
conforme à mon fichier de base.
Juste un bémol, les données de type date sont encadrées
de doubles cote et quand la valeur est absente cela donne
ceci :

jean;dupond;"";44;

Dany


"Jean-Marc" a écrit dans le message de news:
42e7da4d$0$10363$
"Aski" a écrit dans le message de
news:
Hi Jean-Marc,

En folâtrant sur son clavier, Jean-Marc s'est exprimé ainsi :

> Je suppose que le début "Nom;Prenom;Age;Ville" n'est présent
> qu'une fois et peut être simplement ignoré, ou à la rigueur utilisé
> pour créer dynamiquement une table en utilisant les libellés comme
> nom de champ. Ca sera "bof", car on ne connait pas le type, on
> pourrait supposer qu'on met en tout en CHAR(255) et que ça ira comme
> ça. De même, rien ne nous dit ou s'arrête la description des
> libellés des champs et ou commencent les données. On pourra
> supposer que c'est un paramètre quelque part, et que dans notre
> exemple il vaut 4.



Je vais lire la ligne d'exemple dans un fichier texte terminé par FileEnd


>> Char(255). comme tu le suggères.
Mais de toutes façons l'absence de ';' déterminera la fin de la lecture
et
le dernier enregistrement.




Non non, je voulais juste dire qu'en l'absence d'indication du TYPE des
données,
on peut décider que tous les champs seront de type STRING (CHAR OU VARCHAR
selon la base utilisée), d'un taliie de 255 caractères.

J'utiliserai un tableau dynamique de 'Records'.
Is it Ok ?



Pour moi c'est très bien, ça doit répondre au besoin de Daniel, en tout
cas pour un exemple.

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



Avatar
Aski
Hi Dany,

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

Je vous remercie de vous décarcasser pour moi.
Je vous aurait bien mis mon fichier en téléchargement
mais il contient des données confidentielles.
L'exemple de fichier que j'ai posté précédement est
conforme à mon fichier de base.
Juste un bémol, les données de type date sont encadrées
de doubles cote et quand la valeur est absente cela donne
ceci :

jean;dupond;"";44;

Dany



Je prends en considération cette particularité pour mes essais.
Dany, essaie de respecter les règles de présentation pour les NG en
répondant en dessous du message auquel tu réponds.
Merci

Aski



"Jean-Marc" a écrit dans le message
de news: 42e7da4d$0$10363$
"Aski" a écrit dans le message de
news:
Hi Jean-Marc,

En folâtrant sur son clavier, Jean-Marc s'est exprimé ainsi :

Je suppose que le début "Nom;Prenom;Age;Ville" n'est présent
qu'une fois et peut être simplement ignoré, ou à la rigueur
utilisé pour créer dynamiquement une table en utilisant les
libellés comme nom de champ. Ca sera "bof", car on ne connait pas
le type, on pourrait supposer qu'on met en tout en
CHAR(255) et que ça ira comme ça. De même, rien ne nous dit ou
s'arrête la description des libellés des champs et ou
commencent les données. On pourra supposer que c'est un
paramètre quelque part, et que dans notre exemple il vaut 4.





Je vais lire la ligne d'exemple dans un fichier texte terminé par
FileEnd = Char(255). comme tu le suggères.
Mais de toutes façons l'absence de ';' déterminera la fin de la
lecture et
le dernier enregistrement.




Non non, je voulais juste dire qu'en l'absence d'indication du TYPE
des données,
on peut décider que tous les champs seront de type STRING (CHAR OU
VARCHAR selon la base utilisée), d'un taliie de 255 caractères.

J'utiliserai un tableau dynamique de 'Records'.
Is it Ok ?



Pour moi c'est très bien, ça doit répondre au besoin de Daniel, en
tout cas pour un exemple.

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




Avatar
Aski
Hi Dany,

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

Hi Dany,

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

Je vous remercie de vous décarcasser pour moi.
Je vous aurait bien mis mon fichier en téléchargement
mais il contient des données confidentielles.
L'exemple de fichier que j'ai posté précédement est
conforme à mon fichier de base.
Juste un bémol, les données de type date sont encadrées
de doubles cote et quand la valeur est absente cela donne
ceci :

jean;dupond;"";44;

Dany



Je prends en considération cette particularité pour mes essais.
Dany, essaie de respecter les règles de présentation pour les NG en
répondant en dessous du message auquel tu réponds.
Merci

Aski



Je remarque que l'enregistrement dont tu parles ici n'est pas le même que le
précédent :
Avant Après
nom prénom
prénom nom
âge date
ville âge
Je veux bien modifier l'exemple, mais il faut préciser ce point.

Aski
Avatar
Aski
Hi,

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

Hi Dany,

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

Hi Dany,

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

Je vous remercie de vous décarcasser pour moi.
Je vous aurait bien mis mon fichier en téléchargement
mais il contient des données confidentielles.
L'exemple de fichier que j'ai posté précédement est
conforme à mon fichier de base.
Juste un bémol, les données de type date sont encadrées
de doubles cote et quand la valeur est absente cela donne
ceci :

jean;dupond;"";44;

Dany



Je prends en considération cette particularité pour mes essais.
Dany, essaie de respecter les règles de présentation pour les NG en
répondant en dessous du message auquel tu réponds.
Merci

Aski



Je remarque que l'enregistrement dont tu parles ici n'est pas le même
que le précédent :
Avant Après
nom prénom
prénom nom
âge date
ville âge
Je veux bien modifier l'exemple, mais il faut préciser ce point.

Aski



Voici, comme prévu un code qui fonctionne en fonction de ce qui est demandé.
On peut peut-être faire mieux ...

Copier l'ensemble du code dans un module.
Lancer Init, puis EcrireCSV pour enregistrer le jeu d'essai.
Lancer Init, puis LitCSV pour remplir les enregistrements (et les suivre
avec points d'arrêts)

Aski

./////////////// Début code
Option Explicit

Private Const NameFileCSV = "CSV.csv"

Private Type PersonRecord
Nom As String
Prénom As String
Age As String
Ville As String
End Type

Private nFiles As Integer
Private DirApp As String, FileEnd As String, Line As String
Private Fiche() As PersonRecord

Public Sub Init()
DirApp = App.Path & ""
FileEnd = Chr(255)
End Sub

Public Sub LitCSV()
Dim Pos As Integer, i As Integer, j1 As Integer, j2 As Integer, j3 As
Integer, j4 As Integer
On Error GoTo Erreur
Open DirApp & NameFileCSV For Input As #1
Input #1, Line
'rechercher le nombre de ";"
Pos = 0: nFiles = 0
Do
Pos = InStr(Pos + 1, Line, ";")
'nFiles est le nombre recherché
If Pos > 0 Then nFiles = nFiles + 1
Loop Until Pos = 0
'rechercher le nombre de fiches (4 enregistrements oar fiche)
nFiles = nFiles 4
'dimensionner dynamiquement
Erase Fiche
ReDim Fiche(nFiles)
'décoder les fiches
'pour optimiser, ce décodage peut être réalisé dans la boucle Do ... Loop
précédente
Pos = 0
For i = 0 To nFiles - 1
j1 = InStr(Pos + 1, Line, ";")
Fiche(i).Nom = Mid$(Line, Pos + 1, j1 - Pos - 1)
j2 = InStr(j1 + 1, Line, ";")
Fiche(i).Prénom = Mid$(Line, j1 + 1, j2 - j1 - 1)
j3 = InStr(j2 + 1, Line, ";")
Fiche(i).Age = Mid$(Line, j2 + 1, j3 - j2 - 1)
j4 = InStr(j3 + 1, Line, ";")
Fiche(i).Ville = Mid$(Line, j3 + 1, j4 - j3 - 1)
Pos = j4
Next i
Close
Exit Sub
Erreur:
MsgBox Error, , "LitCSV"
End Sub

Public Sub EcritCSV()
Dim iFile As Integer
'remplir un fichier avec le jeu d'essai
nFiles = 4
Erase Fiche
ReDim Fiche(nFiles)
With Fiche(0)
.Nom = "Nom"
.Prénom = "Prenom"
.Age = "Age"
.Ville = "Ville"
End With
With Fiche(1)
.Nom = "Dupond"
.Prénom = "Jean"
.Age = "58"
.Ville = "Marseille"
End With
With Fiche(2)
.Nom = "Robin"
.Prénom = ""
.Age = "47"
.Ville = "Paris"
End With
With Fiche(3)
.Nom = "Etienne"
.Prénom = "Régis"
.Age = "45"
.Ville = "Lourdes"
End With
With Fiche(4)
.Nom = "Dupont"
.Prénom = "Jacques"
.Age = """"""
.Ville = "Isigny"
End With

Open DirApp & NameFileCSV For Output As #1
For iFile = 0 To nFiles
Print #1, Fiche(iFile).Nom; ";";
Print #1, Fiche(iFile).Prénom; ";";
Print #1, Fiche(iFile).Age; ";";
Print #1, Fiche(iFile).Ville; ";";
Next iFile
Print #1, FileEnd
Close
End Sub
/////////////// Fin code
Avatar
Daniel AUBRY
"Aski" a écrit dans le message de news:

Hi Dany,

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

Hi Dany,

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

Je vous remercie de vous décarcasser pour moi.
Je vous aurait bien mis mon fichier en téléchargement
mais il contient des données confidentielles.
L'exemple de fichier que j'ai posté précédement est
conforme à mon fichier de base.
Juste un bémol, les données de type date sont encadrées
de doubles cote et quand la valeur est absente cela donne
ceci :

jean;dupond;"";44;

Dany



Je prends en considération cette particularité pour mes essais.
Dany, essaie de respecter les règles de présentation pour les NG en
répondant en dessous du message auquel tu réponds.
Merci

Aski



Je remarque que l'enregistrement dont tu parles ici n'est pas le même que
le précédent :
Avant Après
nom prénom
prénom nom
âge date
ville âge
Je veux bien modifier l'exemple, mais il faut préciser ce point.

Aski



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é;


Dany,
1 2 3