Convertir fichier Csv vers Paradox [Résolu]

pierrotk10d 101 Messages postés mardi 13 novembre 2007Date d'inscription 16 mars 2018 Dernière intervention - 21 déc. 2013 à 18:01 - Dernière réponse : f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscriptionModérateurStatut 9 mars 2018 Dernière intervention
- 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
Afficher la suite 

Votre réponse

9 réponses

sp40 1293 Messages postés mardi 28 octobre 2003Date d'inscriptionContributeurStatut 3 juillet 2015 Dernière intervention - 23 déc. 2013 à 09:21
0
Utile
Salut,

tu peux poster ton code et un extrait du csv à importer ?
Commenter la réponse de sp40
pierrotk10d - 24 déc. 2013 à 09:59
0
Utile
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
Commenter la réponse de pierrotk10d
sp40 1293 Messages postés mardi 28 octobre 2003Date d'inscriptionContributeurStatut 3 juillet 2015 Dernière intervention - 24 déc. 2013 à 11:01
0
Utile
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 ?
Commenter la réponse de sp40
pierrotk10d - 24 déc. 2013 à 15:40
0
Utile
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.
Commenter la réponse de pierrotk10d
solilog 273 Messages postés samedi 13 juin 2009Date d'inscription 18 avril 2015 Dernière intervention - 26 déc. 2013 à 19:15
0
Utile
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
Commenter la réponse de solilog
pierrotk10d - 26 déc. 2013 à 21:25
0
Utile
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
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
sp40 1293 Messages postés mardi 28 octobre 2003Date d'inscriptionContributeurStatut 3 juillet 2015 Dernière intervention - 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
Commenter la réponse de pierrotk10d
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscriptionModérateurStatut 9 mars 2018 Dernière intervention - 27 déc. 2013 à 23:29
0
Utile
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;

Commenter la réponse de f0xi

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.