11
votes

Delphi Tquery enregistrer dans le fichier csv

Je veux exporter du contenu d'une tquery vers un fichier CSV sans utiliser de composant de pièce 3D (Delphi 7). De ma connaissance, cela ne peut pas être accompli avec des composants standard DELPHI.

Ma solution consistait à enregistrer le contenu d'une source de fichiers avec un format CSV et d'enregistrer dans un fichier.

Y a-t-il une solution confortable?

PS: Je ne veux pas utiliser JVCSVDaTaset ou n'importe quel composant. La question est la suivante: peut-il être accompli uniquement avec des composants standard Delphi 7 ou plus?

Merci d'avance!


2 commentaires

Il est assez simple d'écrire un émetteur de fichier CSV. Puisque vous ne pouvez pas trouver de fonctionnalités intégrées et que vous ne voulez pas que vous n'auriez pas besoin de solutions de 3e partie, vous aurez probablement besoin de descendre de cet itinéraire.


Depuis que nous parlons de CSV, il y a un bel article sur les modèles de conception, utilisez un analyseur CSV comme exemple - conférences. Embarcadero.com/article/32129


4 Réponses :


15
votes

Bien sûr que cela peut.

Vous devez simplement faire le travail pour émettre correctement la teneur en CSV (citant correctement, manipuler des citations intégrées et des virgules, etc.). Vous pouvez facilement écrire la sortie à l'aide de TfileStream et obtenir les données à l'aide du tquery.fields et tquery.fieldcount correctement. << P> Je quitterai la csv fantaisie citant et une manipulation spéciale pour vous. Cela s'occupera de la partie facile: xxx


2 commentaires

Quelques informations sur la manière d'échapper à la tige: csvreader.com/csv_format.php


@Radu Barbu: Soyez conscient du formatage de la date lors de l'importation d'un CSV dans une feuille de calcul (je suppose que vous voulez le faire). Fi. Excel essaie de deviner la date basée sur l'entrée, alors assurez-vous que vos dates sont correctement traitées (si elles sont présentes bien sûr). Essayez de les convertir explicitement en format 'DD-MMM-AAAAYY' si vous avez des problèmes.



9
votes

La question initiale a demandé une solution à l'aide d'une source de fichiers. Donc, ce serait quelque chose de plus comme ça. Il fonctionnera avec n'importe quel Tdataset, pas seulement une tquery.

procedure WriteDataSetToCSV(DataSet: TDataSet, FileName: String);
var
  List: TStringList;
  S: String;
  I: Integer;
begin
  List := TStringList.Create;
  try
    DataSet.First;
    while not DataSet.Eof do
    begin
      S := '';
      for I := 0 to DataSet.FieldCount - 1 do
      begin
        if S > '' then
          S := S + ',';
        S := S + '"' + DataSet.Fields[I].AsString + '"';
      end;
      List.Add(S);
      DataSet.Next;
    end;
  finally
    List.SaveToFile(FileName);
    List.Free;
  end;
end;


2 commentaires

Question n'a pas Demandez pour une solution utilisant TStringList. Il vient de demander une solution qui n'utilisait pas les bibliothèques tierces.


Correction: Semicolon requis après Tdataset, pas de virgule. "Procédure WritedatasetCsv (jeu de données: Tdataset; nom de fichier: chaîne);"



1
votes

Delphi ne fournit aucun accès intégré aux données .csv. Cependant, suite au paradigme VCL TXMLTRANSFORM, j'ai écrit une aide de la classe TCSVTransform qui traduira une structure .csv vers / depuis un TClientDataSet. Quant à la question initiale d'exporter une tquery sur .csv, un simple TdataSetProvider fera le lien entre Tquery et TClientDaTaset. Pour plus de détails sur TCSVTransform, cf http://didiacer.cabale.free.fr/delphi. htm # ucsvtransform


0 commentaires

2
votes

Ceci est comme la solution de Rob McDonell, mais avec quelques améliorations: en-tête, les caractères d'échappement, le boîtier que lorsque requis, et ";" séparateur. Vous pouvez facilement désactiver ces améliorations s'il n'est pas requis.

procedure SaveToCSV(DataSet: TDataSet; FileName: String);
const
  Delimiter: Char = ';'; // In order to be automatically recognized in Microsoft Excel use ";", not ","
  Enclosure: Char = '"';
var
  List: TStringList;
  S: String;
  I: Integer;
  function EscapeString(s: string): string;
  var
    i: Integer;
  begin
    Result := StringReplace(s,Enclosure,Enclosure+Enclosure,[rfReplaceAll]);
    if (Pos(Delimiter,s) > 0) OR (Pos(Enclosure,s) > 0) then  // Comment this line for enclosure in every fields
        Result := Enclosure+Result+Enclosure;
  end;
  procedure AddHeader;
  var
    I: Integer;
  begin
    S := '';
    for I := 0 to DataSet.FieldCount - 1 do begin
      if S > '' then
        S := S + Delimiter;
      S := S + EscapeString(DataSet.Fields[I].FieldName);
    end;
    List.Add(S);
  end;
  procedure AddRecord;
  var
    I: Integer;
  begin
    S := '';
    for I := 0 to DataSet.FieldCount - 1 do begin
      if S > '' then
        S := S + Delimiter;
      S := S + EscapeString(DataSet.Fields[I].AsString);
    end;
    List.Add(S);
  end;
begin
  List := TStringList.Create;
  try
    DataSet.DisableControls;
    DataSet.First;
    AddHeader;  // Comment if header not required
    while not DataSet.Eof do begin
      AddRecord;
      DataSet.Next;
    end;
  finally
    List.SaveToFile(FileName);
    DataSet.First;
    DataSet.EnableControls;
    List.Free;
  end;
end;


0 commentaires