FireDac TFDBatchMoveTextReader未带入完整字段值

问题描述 投票:0回答:2

我有一个要与FireDAC BatchMove系列组件(TextReader和DataSetWriter)一起导入的CSV文件。

样本CSV数据

Vehicle,State,Toll distance (mi),Distance (mi),Time (hours)
Tr226,VA,0.0,8679.9,142.5
Tr114,VA,0.0,7227.2,151.5

样本代码

  {FDBatchMove, FDBatchMoveTextReader, FDBatchMoveDataSetWriter, and FDMemTable are declared in the Private declarations of my form}
  FDBatchMove := TFDBatchMove.Create(nil);
  FDBatchMoveTextReader := TFDBatchMoveTextReader.Create(nil);
  FDBatchMoveDataSetWriter := TFDBatchMoveDataSetWriter.Create(nil);

  FDMemTable := TFDMemTable.Create(nil);

  FDBatchMoveTextReader.FileName := 'Y:\Shared\VehicleShort.csv';
  FDBatchMoveDataSetWriter.DataSet := FDMemTable;

  FDBatchMove.Reader := FDBatchMoveTextReader;
  FDBatchMove.Writer := FDBatchMoveDataSetWriter;

  FDBatchMove.Analyze := [taDelimSep, taHeader, taFields];

  FDBatchMove.AnalyzeSample := 10;

  FDBatchMove.Execute;

执行完上面的块后,我遍历FDMemTable并显示第一个字段的内容:

  FDMemTable.First;
  while not FDMemTable.Eof do
  begin
    ShowMessage(FDMemTable.Fields[0].AsString);
    FDMemTable.Next;
  end;

我得到以下答案。注意最后一个字符被截断:

Tr22
Tr11

如果我修改CSV数据以包含更长的车辆名称,例如Truck226和Truck114,则最后一个字符被截断时会遇到相同的问题。

Truck22
Truck11

我对这里可以做的事情有点不知所措。我需要在运行时创建BatchMove组件,而Delphi附带的演示没有足够的深度让我自己解决问题。

delphi delphi-10-seattle firedac
2个回答
0
投票

csv中的字符串字段未用定界符(双引号或单引号)引起来,因此必须设置FDBatchMoveTextReader.DataDef.Delimiter := #0;


0
投票

在FredS评论后,我意识到,如果我根据SO问题来构建项目,它会起作用。这使我意识到我的文件必须具有特殊性。我意识到我的文件只有换行符。我用回车符\换行符替换了所有换行符,它起作用了。

经过一些研究,我可以使用FDBatchMoveTextReader.DataDef.EndOfLine来控制此行为。

© www.soinside.com 2019 - 2024. All rights reserved.