我使用以下方法成功将 CSV 读入 TStrings:
procedure TForm2.FormCreate(Sender: TObject);
begin
SL := TStringList.Create;
SL.Delimiter := ','; // default, but ";" is used with some locales
SL.QuoteChar := '"'; // default
SL.StrictDelimiter := True; // required: strings are separated *only* by Delimiter
end;
20211605344,04/23/2021 - 09:26:42 am,4/28/2021,"Wood Drive, ENFIELD, CT","Calini, CBM",3223837, ENFIELD,Hartford,1,3,No as-built attached
20211300637,03/29/2021 - 11:48:51 am,4/1/2021,"Enfield Street, ENFIELD, CT",CBM,3223846, ENFIELD,Hartford,2,0,Job changed to aerial
现在我尝试将每一行读入动态数组,以便我可以分配每个字段。
procedure TForm2.Button2Click(Sender: TObject);
var
i:integer;
TicketNumber:string;
oneStr: TStringDynArray;
val:double;
begin
SL.LoadFromFile('D:\DelphiProjects\ImportCSV\PURA Phase 2 inspection selection.csv');
for I := 1 to SL.Count-1 do
begin
oneStr:= SplitString(SL[i], ',');
TicketNumber:= oneStr[0];
If TryStrToFloat(TicketNumber, val)then
memo2.Lines.Add('TicketNo: '+oneStr[0]+' '+'Job Date: '+oneStr[1]+' '+ 'Job Start: '+oneStr[2]+' '+'Address: '+oneStr[3]+' '+ 'Crew: '+oneStr[4]+' '+'Project: '+oneStr[5]+' '+'Town: '+oneStr[6]+' '+'County: '+oneStr[7]+' '+'Order: '+oneStr[8]+' '+'Count: '+oneStr[9]+' '+'Note: '+oneStr[10]);
end;
end;
我得到的是:
TicketNo: 20211605344 Job Date: 04/23/2021 - 09:26:42 am Job Start: 4/28/2021 Address: "Wood Drive Crew: ENFIELD Project: CT" Town: "Calini County: CBM" Order: 3223837 Count: ENFIELD Note: Hartford
TicketNo: 20211300637 Job Date: 03/29/2021 - 11:48:51 am Job Start: 4/1/2021 Address: "Enfield Street Crew: ENFIELD Project: CT" Town: CBM County: 3223846 Order: ENFIELD Count: Hartford Note: 2
双引号内的逗号也被打破了!! 我怎样才能防止这种情况发生? 谢谢 德尔福11.2
正如 Ken White 所说,该记录需要使用 Pos 语句和副本手动解析。 但我的解决方案是让我的客户将 Excel 导出为制表符分隔文本,这允许我使用 #9 作为严格分隔符。