FireDac TFDBatchMoveTextReader не вводит полное значение поля - PullRequest
0 голосов
/ 24 октября 2019

У меня есть файл 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, не достаточно углублены, чтобы я мог решить проблему самостоятельно.

Ответы [ 2 ]

0 голосов
/ 24 октября 2019

После того, как FredS прокомментировал, я понял, что это сработало, если я построил проект из своего SO вопроса. Это дало мне понять, что у моего файла должна быть особенность. Я понял, что в моем файле были только переводы строк. Я заменил все переводы строк на возврат каретки \ переводы строк, и это сработало.

После некоторых исследований я могу использовать FDBatchMoveTextReader.DataDef.EndOfLine для управления этим поведением.

0 голосов
/ 24 октября 2019

Строковые поля в csv не заключены в разделитель (двойная или одинарная кавычка), поэтому необходимо установить FDBatchMoveTextReader.DataDef.Delimiter := #0;

...