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. P>
Ma solution consistait à enregistrer le contenu d'une source de fichiers avec un format CSV et d'enregistrer dans un fichier. p>
Y a-t-il une solution confortable? p>
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? P>
Merci d'avance! P>
4 Réponses :
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 code> et obtenir les données à l'aide du tquery.fields code> et tquery.fieldcount code> correctement. P> << P> Je quitterai la csv fantaisie citant et une manipulation spéciale pour vous. Cela s'occupera de la partie facile: p>
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.
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;
Question n'a pas Demandez I> 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);"
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 p>
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;
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