使用 Delphi 用逗号分割字符串但忽略双引号内的逗号

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

我使用以下方法成功将 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

parsing delphi split delphi-11-alexandria
1个回答
0
投票

正如 Ken White 所说,该记录需要使用 Pos 语句和副本手动解析。 但我的解决方案是让我的客户将 Excel 导出为制表符分隔文本,这允许我使用 #9 作为严格分隔符。

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