FireDac TFDBatchMoveTextReader 没有引入完整的字段值
FireDac TFDBatchMoveTextReader not bringing in the full field value
我有一个 CSV 文件,我想用 FireDAC BatchMove 组件系列(TextReader 和 DataSetWriter)导入。
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 附带的演示没有深入到我自己解决问题的程度。
csv 中的字符串字段未用定界符(双引号或单引号)括起来,因此您必须设置 FDBatchMoveTextReader.DataDef.Delimiter := #0;
在 FredS 发表评论后,我意识到如果我根据我的 SO 问题构建项目,它会起作用。这让我意识到我的文件一定有一个特殊性。我意识到我的文件只有换行符。我用 Carriage Return \ Line Feeds 替换了所有 Line Feeds 并且它有效。
经过一些研究,我可以使用 FDBatchMoveTextReader.DataDef.EndOfLine 来控制这种行为。
我有一个 CSV 文件,我想用 FireDAC BatchMove 组件系列(TextReader 和 DataSetWriter)导入。
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 附带的演示没有深入到我自己解决问题的程度。
csv 中的字符串字段未用定界符(双引号或单引号)括起来,因此您必须设置 FDBatchMoveTextReader.DataDef.Delimiter := #0;
在 FredS 发表评论后,我意识到如果我根据我的 SO 问题构建项目,它会起作用。这让我意识到我的文件一定有一个特殊性。我意识到我的文件只有换行符。我用 Carriage Return \ Line Feeds 替换了所有 Line Feeds 并且它有效。
经过一些研究,我可以使用 FDBatchMoveTextReader.DataDef.EndOfLine 来控制这种行为。