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

cs_kami59 Messages postés 24 Date d'inscription dimanche 9 novembre 2008 Statut Membre Dernière intervention 5 mai 2009 1
26 avril 2009 à 13:02
Kami.59

Bonjour Cantador,

Tu trouveras le code pour mon importation ci-dessous.
1
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
25 avril 2009 à 11:28
bonjour,

mets le code

cantador
0
cs_kami59 Messages postés 24 Date d'inscription dimanche 9 novembre 2008 Statut Membre Dernière intervention 5 mai 2009 1
26 avril 2009 à 13:01
Kami.59

Procedure TForm1.CreerSchemaIni(APath, ANameOnly: TFileName; const ADelimiteur: ShortString);
var
SchemaIni: TIniFile;
begin
    SchemaIni:=Nil;
  try
    SchemaIni:=TIniFile.Create(IncludeTrailingPathDelimiter(APath)+'SCHEMA.ini');
    SchemaIni.WriteString(ANameOnly, 'Format', 'Delimited('+ADelimiteur+')');
  finally
    SchemaIni.Free;
  end;
end;


procedure TForm1.ImportDirectCVSToBase(ADOObject : TADOConnection ; PathFichierCSV, NomFichierCSV, DBPath:TFileName ; NomTable : string ; Delimiteur : Char);
const
Requete='INSERT INTO [%s] IN "%s" SELECT * FROM %s;';


begin
  try
    CreerSchemaIni(PathFichierCSV, NomFichierCSV,Delimiteur);
    ADOObject.Close;
    ADOObject.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+PathFichierCSV+';Extended Properties="text;HDR=NO;FMT=Delimited"';
    ADOObject.Execute(Format(Requete,[NomTable,DBPath,NomFichierCSV]));


  finally
    ADOObject.Connected:= false;
    ADOObject.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+Extractfilepath(application.ExeName)+'BASE.mdb;Persist Security Info=False';
    ADOObject.LoginPrompt:= false;
    ADOObject.Connected:=true;
    //on E:Exception do
    //begin
    //  showmessage(E.Message);
   // end;
  end;
end;


procedure TForm1.BitBtn2Click(Sender: TObject);


var
cheminfichiercsv,nomfichiercsv,chemindatabase:TFileName;
begin
  if (Radiobutton1.Checked) then
  begin
  try
  cheminfichiercsv:=Form3.Edit1.Text;
  nomfichiercsv:='Wires_List.csv';
  chemindatabase:=extractfilepath(application.ExeName)+'BASE.mdb';
  //ADOConnection1.Connected:= false;
  //ADOConnection1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+Extractfilepath(application.ExeName)+'BASE.mdb;Persist Security Info=False';
  //ADOConnection1.LoginPrompt:= false;
  //ADOConnection1.Connected:=true;
  ADOQuery1.SQL.Text :='DELETE TbImport.* FROM TbImport;';
  ADOQuery1.ExecSQL;
  ImportDirectCVSToBase(ADOconnection1,cheminfichiercsv, nomfichiercsv, chemindatabase, 'TbImport',';');
  //ADOTable1.Active:=true;
  ADOQuery1.SQL.Text :='DELETE TbImport.CODE, TbImport.* FROM TbImport WHERE (((TbImport.CODE) Like "AAZZ*"));';
  ADOQuery1.ExecSQL;
  showmessage ('IMPORTATION NETWORK OK!') ;
  Sousensemble1.Enabled:=True;
  //BitBtn4.Enabled:=true;
  Except
  showmessage('Error for Import File!');
  end;
  end
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
26 avril 2009 à 21:30
essaie de changer cette ligne
nomfichiercsv:='Wires_List.csv';
en
nomfichiercsv:='WiresList.csv';

cantador
0

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

Posez votre question
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
26 avril 2009 à 21:39
autre chose..
dans
CreerSchemaIni(PathFichierCSV, NomFichierCSV, Delimiteur);
Delimiteur n'est pas défini..
il faut lui passer quel délimiteur tu souhaites utiliser.

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

Bonjour Cantador,

J'ai défini Delimiteur avec un ';' et j'ai retiré le "_" de mon "wires_list".
Verdict: j'ai toujours le même problème.
D'autres hypothéses ou solutions?

Merci d'avance.
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
27 avril 2009 à 14:18
En fait, il était déjà définit dans :


ImportDirectCVSToBase(ADOconnection1,cheminfichiercsv, nomfichiercsv, chemindatabase, 'TbImport',';');

donc, c'est pas ça..


Peux-tu mettre quelques enregistrements de ton fichier .csv ?




cantador
0
cs_kami59 Messages postés 24 Date d'inscription dimanche 9 novembre 2008 Statut Membre Dernière intervention 5 mai 2009 1
27 avril 2009 à 16:40
Kami.59

Voici un extrait du fichier csv.
La 1ere ligne c'est le nom des colonnes et en gras les champs qui posent problemes.

Code;LIST;Schema;Prof;Pote;Suff2;MW_code;Sleeve_D;School_Class;Origin_d;From_P;Origin_location;Dest_D;To_P;Destination_Location

XXXX772001;SCIE;XXXX771039;D;26121;;;;4B;CM-26Y1;1;TOTO;26K2;2;TITI

XXXX772009;TOIT;XXXX771046;BL;10706;;BL716;BL;5;CF-BR;SH36;TUTU;10A1;SH36;TUTU

XXXX772009;TOIT;XXXX771046;BL;10707;;BL717;BL;5;CF-BR;SH36;TUTU;10A1;SH36;TUTU

XXXX772009;TOIT;XXXX771046;BL;10708;;BL718;BL;5;CF-BR;SH36;TUTU;10A1;SH36;TUTU

XXXX772009;TOIT;XXXX771046;BL;10709;;BL719;BL;5;CF-BR;SH36;TUTU;10A1;SH36;TUTU

XXXX772009;TOIT;XXXX771046;;10709;;BL719;1;5;CF-BR;#4;TUTU;10A1;0;TUTU

XXXX772009;TOIT;XXXX771046;;10706;;BL716;1;5;CF-BR;#1;TUTU;10A1;0;TUTU

XXXX772009;TOIT;XXXX771046;;10707;;BL717;1;5;CF-BR;#2;TUTU;10A1;0;TUTU

XXXX772009;TOIT;XXXX771046;;10708;;BL718;1;5;CF-BR;#3;TUTU;10A1;0;TUTU

Je desespere.

c'est vraiment bizarre.
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
27 avril 2009 à 17:31
je viens juste de te lire..
juste un truc..as tu vérfier si le type du champ en gras (déclaré dans la table) ne posait pas de problème par hasard ???
est-il le même que le précédent qui fonctionne ?

cantador
0
cs_kami59 Messages postés 24 Date d'inscription dimanche 9 novembre 2008 Statut Membre Dernière intervention 5 mai 2009 1
27 avril 2009 à 18:28
j'ai vérifié dans access et le type et sur "texte".
Aussi bien en importation auto avec delphi qu'en importation manuel en direct dans access.
La seule difference est qu'en importation automatique ca bug sur les alphanumerique (en gras ci-dessus).

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
28 avril 2009 à 09:29
Tu n'as pas d'autres hypothéses cantador?

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
28 avril 2009 à 19:24
désolé, mais j'étais pas mal pris ces temps ci..
pour revenir sur le sujet, lors de l'importation est ce qu'une partie des données sont néanmoins stockées dans access ?

cantador
0
cs_kami59 Messages postés 24 Date d'inscription dimanche 9 novembre 2008 Statut Membre Dernière intervention 5 mai 2009 1
28 avril 2009 à 22:19
C'est à dire?


J'ai crée une table avec 10 enregistrements uniquement avec du texte que j'insére dans ma table principale avant l'import.

c'est un ajout que j'ai fait pour essayer de pallier à mon problème sur les champs alphanumérique mais rien ne change.

J'ai également la table principale qui est vide avant l'import et l'ajout.

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
29 avril 2009 à 09:32
ton champ "Code" qui normalement doit être une clé primaire reçoit le même enregsitrement :

XXXX772009

si tel est la cas, c'est normal, ca tu as des doublons dans ta clé...
essaie d'envoyer un seul enregistrement :
le premier par exemple :
XXXX772001;SCIE;XXXX771039;D;26121;;;;4B;CM-26Y1;1;TOTO;26K2;2;TITI

cantador
0
cs_kami59 Messages postés 24 Date d'inscription dimanche 9 novembre 2008 Statut Membre Dernière intervention 5 mai 2009 1
29 avril 2009 à 10:31
J'ai essayé avec l'enregistrement ci-dessus et ca fonctionne.
Par contre dès que j'en met 2 ça ne fonctionne plus (les deux 1er enregistrements).

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
29 avril 2009 à 13:57
Bien on avance un peu...
Quel est le type du champ CODE dans la base access ?

cantador
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
29 avril 2009 à 14:11
j'ai modifié ton code et tout testé avec :

CSV :
CODE;CHAMP1;CHAMP2;CHAMP3
1000;tata;toto;titi
2000;papa;pepe;papi
3000;roro;riri;rara

et une table TImportdans access avec
CODE
CHAMP1
CHAMP2
CHAMP3
le tout en format Texte


voici le code qui n'est pas du tout optimisé mais qui fonctionne...

unit Unit1;


interface


uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, StdCtrls, IniFiles;


type
  TForm1 = class(TForm)
    Button1: TButton;
    ADOQuery1: TADOQuery;
    ADOQuery1CODE: TWideStringField;
    ADOQuery1CHAMP1: TWideStringField;
    ADOQuery1CHAMP2: TWideStringField;
    ADOQuery1CHAMP3: TWideStringField;
    ADOConnection1: TADOConnection;
    procedure Button1Click(Sender: TObject);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;


var
  Form1: TForm1;
  SchemaIni: TIniFile;
 
implementation


{$R *.dfm}


const
  cstADOCsvConnexion = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Extended Properties="text;HDR=YES;Format=Delimited"';


procedure CreerSchemaIni(APath, ANameOnly: TFileName; const ADelimiteur: ShortString);
begin
  try
    SchemaIni := nil;
    SchemaIni := TIniFile.Create(IncludeTrailingPathDelimiter(APath) + 'Schema.ini');
    SchemaIni.WriteString(ANameOnly, 'Format', 'Delimited(' + ADelimiteur + ')');
  finally
    SchemaIni.Free;
  end;
end;


procedure ImportDirectCVSToBase(PathFichierCSV, NomFichierCSV: TFileName);
const
  Requete = 'INSERT INTO [%s] IN "%s" SELECT * FROM %s';
  cstDefautSeparateurChamp = ';';
  NomTable = 'TImport';
var
  cstNomBase: string;
begin
  try
    cstNomBase := 'bd1.mdb';
    CreerSchemaIni(PathFichierCSV, NomFichierCSV, cstDefautSeparateurChamp);
    Form1.ADOConnection1.Close;
    Form1.ADOConnection1.ConnectionString := Format(cstADOCsvConnexion, [PathFichierCSV]);


    Form1.ADOConnection1.Execute(Format(Requete, [NomTable,
      IncludeTrailingPathDelimiter(PathFichierCSV) + cstNomBase,
        NomFichierCSV]));


  finally
    Form1.ADOConnection1.Close;
  end;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  cheminfichiercsv, nomfichiercsv, chemindatabase: TFileName;
begin
//  if (Radiobutton1.Checked) then
//  begin
  try
    try
      Screen.Cursor := CrHourGlass;
      cheminfichiercsv := extractfilepath(application.ExeName);
      nomfichiercsv := 'Classeur1.csv';
      chemindatabase := extractfilepath(application.ExeName) + 'bd1.mdb';
      ADOConnection1.Connected := false;
      ADOConnection1.Connected := true;
      ADOQuery1.SQL.Text := 'DELETE TImport.* FROM TImport;';
      ADOQuery1.ExecSQL;


// Importation du CSV dans la table
      ImportDirectCVSToBase(cheminfichiercsv, nomfichiercsv);


{  ADOQuery1.SQL.Text := 'DELETE TImport.CODE, TImport.* FROM TImport WHERE (((TImport.CODE) Like "AAZZ*"));';
  ADOQuery1.ExecSQL;
  showmessage('IMPORTATION NETWORK OK!');   }


//    Sousensemble1.Enabled := True;
  //BitBtn4.Enabled:=true;
 
    finally
      Screen.Cursor := CrDefault;
      ShowMessage('Importation terminée !');
    end;
  except
    showmessage('Error for Import File!');
  end;
end;

end.

cantador
0
cs_kami59 Messages postés 24 Date d'inscription dimanche 9 novembre 2008 Statut Membre Dernière intervention 5 mai 2009 1
29 avril 2009 à 21:33
Peux tu faire un essai avec l'importation dans le champ1 (en texte), de valeurs numériques et alphanumérique? pour voir si ça fonctionnent aussi.

Car les données que j'insére dans le champ1(en texte) par exemple peut être purement du texte, du texte contenant uniquement des chiffres ou des chiffres avec des lettres.

J'ai refait un test d'import avec mon prog, du csv et voici un petit résultat.

Import deux enregistrements avec valeurs texte et alphanumérique ->OK

Import deux enregisrements avec valeurs texte et numérique -> le texte n'est pas ajouté.

Import deux enregistrements avec valeurs numérique et alphanumérique -> la valeur alphanumérique n'est pas ajouté.

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
29 avril 2009 à 21:56
oui, bien sûr; j'ai refait un test avec  le code fourni et ceci pour le CSV :
CODE;CHAMP1;CHAMP2;CHAMP3
1000;tata;250;titi
2000;papa;A28;papi
3000;roro;AbCd7;rara

et aucun souci tout se retrouve dans la table..

Mais, je ne vois pourquoi tu fais des différences alpha ou pas..
Dès l'instant où ton champ est déclaré en texte, tu peux mettre tout ce que tu veux dedans (alphanumérique, alpha, numérique...)


il n'y a que dans le cas où tu prends le type numérique que le choix est restreint..
et tu n'as pas répondu à ma question sur le type du champ "CODE"..

cantador
0
cs_kami59 Messages postés 24 Date d'inscription dimanche 9 novembre 2008 Statut Membre Dernière intervention 5 mai 2009 1
29 avril 2009 à 22:11
Dans quel composant je trouve les TWideStringField ?

Kami.59
0
Rejoignez-nous