首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Delphi TQuery保存为csv文件

Delphi TQuery保存为csv文件
EN

Stack Overflow用户
提问于 2011-04-16 00:59:56
回答 4查看 30.1K关注 0票数 11

我想在不使用3d零件组件的情况下将TQuery的内容导出到CSV文件(Delphi7)。据我所知,这是不能用Delphi标准组件完成的。

我的解决方案是将内容保存在CSV格式的StringList中,然后将其保存到文件中。

有什么舒适的解决方案吗?

PS:我不想使用JvCsvDataSet或任何组件。问题是:这只能用Delphi 7或更高标准的组件来完成吗?

提前谢谢你!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-04-16 01:18:18

当然可以。

您只需完成正确输出CSV内容的工作(正确引用、处理嵌入的引号和逗号等)。您可以很容易地使用TFileStream编写输出,并使用TQuery.FieldsTQuery.FieldCount正确地获取数据。

我将把奇特的CSV报价和特殊处理留给您。这将处理简单的部分:

代码语言:javascript
复制
var
  Stream: TFileStream;
  i: Integer;
  OutLine: string;
  sTemp: string;
begin
  Stream := TFileStream.Create('C:\Data\YourFile.csv', fmCreate);
  try
    while not Query1.Eof do
    begin
      // You'll need to add your special handling here where OutLine is built
      OutLine := '';
      for i := 0 to Query.FieldCount - 1 do
      begin
        sTemp := Query.Fields[i].AsString;
        // Special handling to sTemp here
        OutLine := OutLine + sTemp + ',';
      end;
      // Remove final unnecessary ','
      SetLength(OutLine, Length(OutLine) - 1);
      // Write line to file
      Stream.Write(OutLine[1], Length(OutLine) * SizeOf(Char));
      // Write line ending
      Stream.Write(sLineBreak, Length(sLineBreak));
      Query1.Next;
    end;
  finally
    Stream.Free;  // Saves the file
  end;
end;
票数 15
EN

Stack Overflow用户

发布于 2011-04-16 09:08:52

最初的问题要求使用StringList解决方案。所以它应该更像这样。它将适用于任何TDataSet,而不仅仅是TQuery。

代码语言:javascript
复制
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;

您可以添加选项来更改分隔符类型或其他任何内容。

票数 9
EN

Stack Overflow用户

发布于 2015-10-15 17:18:39

这类似于Rob McDonell解决方案,但有一些增强:标题、转义字符、仅在需要时才包含,以及";“分隔符。如果不需要,您可以轻松禁用此增强功能。

代码语言:javascript
复制
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;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5680017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档