Problème d'importation de fichier csv dans access avec delphi

cs_kami59 Messages postés 24 Date d'inscription dimanche 9 novembre 2008 Statut Membre Dernière intervention 5 mai 2009 - 24 avril 2009 à 21:28
cs_jjgone Messages postés 7 Date d'inscription lundi 1 mars 2004 Statut Membre Dernière intervention 16 mai 2013 - 12 nov. 2011 à 17:47
Kami.59

Bonjour à tous et à toutes.
J'ai un petit souci et j'espère que quelqu'un sera résoudre mon problème.
J'ai créé un petit programme pour importer un fichier csv dans une base access.
La manip fonctionne bien mais malheureusement je me retrouve avec des champs vides.
Après quelques recherches, j'ai trouvé que c'est lié au texte alphanumérique comme "4B" par exemple.
j'ai essayé d'inclure 10 enregistrements texte dans ma table avant d'importer mais rien n'y fait.
Ce qui est bizarre, c'est que si j'importe manuellement depuis access, je n'ai aucun souci.
Quelqu'un aurait-il une réponse ou une piste sur mon problème car là je séche.

HELP!!!!!!!!!!!!!!!!!!!!!

Merci d'avance.

50 réponses

rec1982 Messages postés 6 Date d'inscription samedi 14 avril 2007 Statut Membre Dernière intervention 5 mai 2009
3 mai 2009 à 22:11
pardant: voila le code:
////////////////////////////////
procedure tform1.importer(t:tadotable;delem:char;cheminf:string);
var f:tstringlist;
    i,col,posdelem:integer;
    vt:variant;
    s,l:string;
begin
f:=tstringlist.create;
f.LoadFromFile(cheminf);
for i:=0to f.Count-1do
    begin
     s:=f.strings[i];
     t.Insert;
     col:=0;
          repeat
           posdelem:=pos(delem,s);
           if posdelem >0then
           l:=copy(s,1,posdelem-1)
           else
           l:=s;
           vt:=vartype(t.Fields[col].Value);
           case vt of vtinteger,vtextended,vtcurrency,vtint64:
           t.Fields[col].AsInteger:=strtoint(l);
           else
           t.Fields[col].asstring:=l;
           end;
           if posdelem >0then
           delete(s,1,posdelem);
           col:=col+1
           until  posdelem=0;
           t.Post;
         
    end;
     f.Free;
end;
 /////////////////
et en fait appelle à cette procedure comme ça:
procedure TForm1.Button2Click(Sender: TObject);
begin
opendialog1.Execute;
importer(t,';',opendialog1.FileName)  ;
showmessage('fin transmission');
end;
cordialement rec1982.
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
4 mai 2009 à 08:09
la solution que j'ai proposée est en sql...

cantador
0
cs_kami59 Messages postés 24 Date d'inscription dimanche 9 novembre 2008 Statut Membre Dernière intervention 5 mai 2009 1
4 mai 2009 à 14:27
Bonjour Cantador.


Je t'ai renvoyé le fichier csv, l'ancien email n'a pas du partir.


Bonjour rec1982, est ce que le code permet l'importation direct dans une table access?

Kami.59
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
4 mai 2009 à 16:46
oui alors j'ai créer un champ "CHAMP4" supplémentaire dans la table TImport.

et avec ton .csv, j'ai lancé le programme et tout marche sans erreur
je t'ai d'ailleurs transmis la base avec les données importées.

J'ai toutefois noté un détail que je ne m'explique pour l'instant :


Toutes les données sont correctement importées mais l'importation déclenche naturellement un TRI croissant sur le champ "CODE" ce qui a pour effet bien entendu de ne pas visualiser les informations dans le même ordre que le .csv.
(ce tri n'étant pas provoqué par une instruction SQL ni un ordre delphi..)

Mais au final, si on réfléchit bien, c'est quand même préférable.

cantador
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_kami59 Messages postés 24 Date d'inscription dimanche 9 novembre 2008 Statut Membre Dernière intervention 5 mai 2009 1
4 mai 2009 à 22:11
Salut Candator


J'ai ouvert ta base et tu as comme moi.


C'est à dire que si tu regardes les champs 3 et 4, tout ce qui est alphanumérique n'apparait pas. (comparaison à faire avec le fichier csv).


Cordialement.

Kami.59
0
rec1982 Messages postés 6 Date d'inscription samedi 14 avril 2007 Statut Membre Dernière intervention 5 mai 2009
5 mai 2009 à 01:48
salut
bien sure il importe tout le fichier csv.
mais pas dans l'ordre de ton fichier csv.
cordialement.
0
cs_kami59 Messages postés 24 Date d'inscription dimanche 9 novembre 2008 Statut Membre Dernière intervention 5 mai 2009 1
5 mai 2009 à 14:14
Bonjour REC1982,

J'ai compilé ta source et en essayant l'import, le prog me marque "ACCESS VIOLATION AT ADDRESS 00477CA8 IN MODULE 'PROJECT1.EXE'. READ OF ADDRESS 8BD88BD7.


C'est dû à quoi? comment résoudre le problème?


Merci d'avance.


Cordialement.

Kami.59
0
cs_kami59 Messages postés 24 Date d'inscription dimanche 9 novembre 2008 Statut Membre Dernière intervention 5 mai 2009 1
5 mai 2009 à 14:41
c'est bon.

j'ai résolu le problème de la violation d'accès.

Ca donne quoi Cantador avec le SQL pour l'import du fichier CSV?

Kami.59
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
7 mai 2009 à 11:39
L'import se passe bien mais quelques enregistrements ne sont curieusement pas stockés dans la table..

Je cherche..

cantador
0
cs_jjgone Messages postés 7 Date d'inscription lundi 1 mars 2004 Statut Membre Dernière intervention 16 mai 2013
12 nov. 2011 à 17:47
Bonjour, je sais que ce topic date un peu, mais comme à priori ça n'a pas été résolu ou tout du moins aucune solution n'a été apportée, je vais tenter d'expliquer le problème ça pourra servir pour quelqu'un d'autre.
Lors de l'import de données d'un fichier csv vers Access par programmation, certaines données sont ignorées et ne sont pas importées dans la table.
En fait cela vient du fait que lors de l'importation du fichier csv microsoft.jet ne se fie pas au type de donnée du champ dans la table, mais scanne le fichier csv et détermine le type de champ en fonction du type majoritaire rencontré. Ceci n'est pas très subtil et peut effectivement apporter des surprises dans l'importation des données.
Pour résoudre le problème, il suffit d'encadrer de guillemet les champs texte contenant des chiffres y compris un champ comme 25AB47 qui donnerait 2547 (??).
Comme encadrer tous les champs serait fastidieux, il suffit de n?encadrer que les champs de la 1ère ligne et de rajouter dans le fichier Schema.ini la ligne :
MaxScanRows=1, ce qui force à ne scanner que la 1ère ligne pour déterminer le type du champ.
Scema.ini ressemblerait à cela avec un ; comme délimiteur de champs:

[Nom du fichier csv]
Format=Delimited(;)
MaxScanRows=1

La procédure de création du fichier Schema.ini serait alors la suivante :

function CreateSchemaFile(CsvFile: TFileName; Delimiter: Char): string;
{
-	CsvFile nom complet du fichier csv
-	Delimiter le caractère délimiteur (ne pas choisir la virgule qui est pour la France le séparateur décimal)	
}
begin
  Result := '';
  with TIniFile.Create(ExtractFilePath(CsvFile) + 'Schema.ini') do
  begin
    try
      WriteString(ExtractFileName(CsvFile), 'Format', 'Delimited(' + Delimiter + ')');
      WriteInteger(ExtractFileName(CsvFile), 'MaxScanRows', 1);
    except
      on E: Exception do
        Result := E.Message;
    end;
    Free;
  end;
end;
Voilà si cela peut servir, bonne journée.
0
Rejoignez-nous