Convertir fichier Csv vers Paradox

Résolu
pierrotk10d Messages postés 110 Date d'inscription mardi 13 novembre 2007 Statut Membre Dernière intervention 2 février 2024 - 21 déc. 2013 à 18:01
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 - 27 déc. 2013 à 23:29
Bonjour,
J'ai un fichier *.CSV contenant des lignes ayant la forme suivante :toto;titi;tata;tutu.
Je veux tranférer chaque ligne dans les enregistrements d'une table paradox.
Tout fonctionne correctement, à une exception près qui me chagrine beaucoup. C'est que j'ai le texte du premier champ et le texte du dernier champs avec des doubles cotes. Comme ci dessous
Champ_1 Champ_2 Champ_3 champ_4
"toto titi tata tutu"
J'ai résolu le problème en les supprimant mais j'aimerais savoir pourquoi ces doubles cotes apparaissent. Qui sait pourquoi ces doubles cotes apparaissent?
Merci et bonnes fêtes de fin d'année à vous

7 réponses

sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
23 déc. 2013 à 09:21
Salut,

tu peux poster ton code et un extrait du csv à importer ?
0
Bonjour,
Voici le code que j'utilise.

Procedure TForm1.FillTResultat(aTab: Array of string);
Var cNumDep, cNumReg: string;
Begin
{* Dans le fichier csv c'est le nom du département qui est present
Dans Resultat.DB on stocke le numéro du département
Le nom du département est dans aTab[2] *}
cNumDep := '999';
cNumReg := '99';
If tDepartement.Locate('Departement', aTab[2], [loCaseInsensitive]) then begin
cNumDep := tDepartement.FieldByName('NumDep').AsString;
cNumReg := tDepartement.FieldByName('NumRegion').AsString;
end;
With tResultat do begin
Append;
FieldByName('Ville').AsString := aTab[0];
FieldByName('Zip').AsString := aTab[1];
FieldByName('NumDep').AsString := cNumDep; // Le nom du dép est dans aTab[2]
FieldByName('NumRegion').AsString := cNumReg;
FieldByName('NumInsee').AsString := aTab[3];
Post;
end;
end;

procedure TForm1.BtnTransformeClick(Sender: TObject);
Var nPosSep, i, n: Integer;
cLigne: string;
aValeur: Array[0..3] of string;
FicCsv: System.Text;
begin
System.Assign(FicCsv, 'c:\Mes documents\delphi\Code Postal\Data\insee.csv');
System.Reset(FicCsv);
Jauge.Min := 0;
Jauge.Max := 39000;
n := 1;
tResultat.Active := True;
try
tResultat.DisableControls;
While not Eof(FicCsv) do begin
ReadLn(FicCsv, cLigne);
// cLigne est entre double cote les enlever
cLigne := Copy(cLigne, 2, 50);
cLigne := Copy(cLigne, 1, Length(cLigne)-1);
For i := 0 To 3 do begin
nPosSep := Pos(';', cLigne);
aValeur[i] := Copy(cLigne, 1, nPosSep-1);
Delete(cLigne, 1, nPosSep);
End; // Next
aValeur[3] := cLigne;
FilltResultat(aValeur);
Jauge.Position := n;
Application.ProcessMessages;
Inc(n);
end; // End While not eof ficcsv
finally
system.Close(FicCsv);
tResultat.First;
tResultat.EnableControls;
end;
end;

Amicales salutations
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
24 déc. 2013 à 11:01
Salut,

Tu pourrais copier/coller les premières lignes de ton fichier csv ?
Est-ce que si tu l'ouvres avec le bloc note tu vois apparaître ces double quote ?
0
Re bonjour,
Voici un bout du fichier csv. Je l'ai ouvert sous Excel et fait une copie des quelques lignes ci dessous. Ensuite je les colle dans le bloc note il n'y a pas de double cotes en début et fin de ligne.
J'ai fait l'essai de transférer ces lignes avec les routines précédentes dans un TMemo en lieu et place d'une table Paradox. Les doubles cotes n'apparaissent pas.
3 lignes du fichier Csv
ANDERT ET CONDON;01300;AIN;1009
ANGLEFORT;01350;AIN;1010
APREMONT;01100;AIN;1011
Les doubles cotes sont peut être mise par Excel lors de l'ouverture.
Bonnes fetes de fin d'année.
0

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

Posez votre question
solilog Messages postés 273 Date d'inscription samedi 13 juin 2009 Statut Membre Dernière intervention 18 avril 2015 10
26 déc. 2013 à 19:15
Bonsoir,
Le prob est simple, il y a confusion entre les 2 séparateurs possibles ";" et "," dans 2 applis ou programmes par o'passe ce CSV. Quelque part, dans la création du CSV, on crée des données avec le sep ";" puis ailleurs on sauve en CSV avec un outil qui utilise des "," et pour lui il n'y a qu'un seul champ (il ne trouve pas de ,) donc il délimite tous les champs comme un seul en emballant le tout avec des ". Tout dépend d'où vient ce CSV (une autre appli, ...), peut-çetre que tu ne pourras pas le régler.
Conseil: au lieu de cuisiner, pos(), copy, ..., utilise la precédure standard de Delphi dans l'unité sysutils :
function AnsiExtractQuotedStr(var Src: PChar; Quote: Char): string;
qui supprimera les " bien plus proprement que toi et qui gerera les éventuels ", ' que contiendrait tes données.
Cordialement.
solilog
0
Bonsoir,
Merci pour toutes ces réponses.
J'ai trouvé le fichier csv sur un site Galichon (je crois) Il contient les codes postaux des 36000 communes de France et d'outre mer.
En ouvrant le fichier csv avec le bloc note je trouve pour chaque chaine des doubles quotes en début et en fin de chaine lorsque je l'ouvrait avec Excel auparavant je ne voyait pas les doubles quotes.
Je ne connaissait pas la fonction AnsiExtractQuotedStr(). je vais l'utiliser.
Encore merci
0
Solilog,
J'ai quelques soucis avec ta fonction AnsiExtractQuotedStr. J'utilise Delphi5
PB avec le premier paramètre. (PChar(Str), '"') provoque un message d'erreur.
[Erreur] Un objet constante ne peut être passé comme paramètre Var
J'ai trouvé StringReplace qui fonctionne bien.

cLig := '"L ABERGEMENT CLEMENCIAT;01400;AIN;1001"' ;
cLig := StringReplace(cLig, '"', '', [rfReplaceAll]);
showmessage(clig); // Renvoie la chaine sans les doubles quotes
L ABERGEMENT CLEMENCIAT;01400;AIN;1001
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
27 déc. 2013 à 09:21
Ah, Solilog a été plus rapide que moi... Dans l'ouest, je serai mort... :-)

Penses à marquer ton sujet "Résolu" si c'est le cas
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
27 déc. 2013 à 23:29
Si tu as D2009 ou mieux ---> TstringList pour le CSV !

var
  N : integer;
  CSVFile : TStringList;
  CSVRow  : TStringList;
const
  X_INDEX = 0;
  X_NAME  = 1;
  X_LANGID= 2;
begin
  CSVFile := TstringList.Create;
  CSVRow := TStringList.Create;
  try
    CSVRow.Delimiter := ';';
    CSVRow.QuoteChar := '"'; 
    CSVRow.StrictDelimiter := true;

    if openDialog1.execute then
    begin
      CSVFile.LoadFromFile();
      //DB.Queries.Prepare(DB_Q_INSERTION, 'translations', ['id', 'name', 'langid']);
      for N := 0 to CSVFile.Count - 1 do
      begin
        CSVRow.DelimitedText := CSVFile[N];
        if CSVRow.Count = 3 then
        begin
          //DB.Queries.SetTypes([
          // 'rowindex|ai',
          // 'char(64) utf-8 escape|null',
          // 'rowindex|1',
          //]);
          //DB.Queries.Append([
          CSVRow[ X_INDEX ], 
          CSVRow[ X_NAME ],
          CSVRow[ X_LANGID ] 
          // ]);
        end;
      end;
      //DB.Execute(DB_MQ);
    end;
  finally
    CSVRow.Free;
    CSVFile.Free;
    //DB.Execute(DB_RECOVER or DB_RESET);
  end;
end;

0
Rejoignez-nous