You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi中CommaText解析字符串时误将空格作为分隔符的问题

Delphi中TStringList解析CSV时字段被空格拆分的解决办法

问题原因

你当前使用的TStringList.CommaText属性,默认会同时将逗号和空格(以及制表符等空白字符)作为分隔符,并且会忽略连续的分隔符。这就导致像0. 7.71、Bad head/nozzle detect这类带空格的字段被错误拆分。

解决方案

改用TStringList的Delimiter和DelimitedText属性,并开启StrictDelimiter,强制只以逗号作为分隔符,保留字段内的空格。

修改后的核心代码

将原来的:

eventlist.CommaText := datalist[i];

替换为:

eventlist.Clear;
eventlist.Delimiter := ',';
eventlist.StrictDelimiter := True; // 仅以逗号作为分隔依据
eventlist.DelimitedText := datalist[i];

// 可选:如果需要去掉每个字段前后的空白(比如字段开头的空格),添加以下循环
for var j := 0 to eventlist.Count - 1 do
  eventlist[j] := Trim(eventlist[j]);

完整修改后的Button1Click过程

procedure TForm4.Button1Click(Sender: TObject);
var
  datalist : tstringlist;
  eventlist : tstringlist;
  i,x,j: Integer;
  filename : string;
  Event : array[1..200] of TEvent;
begin
  datalist := tstringlist.Create;
  eventlist := tstringlist.Create;
  X := 1;

  // 获取最新文件
  filename := getlastmodifiedfilename('C:\Users\tngmorse\Desktop\LockHeads\Win32\Debug\');

  datalist.LoadFromFile(filename);

  // 查找head lockout相关记录
  for i := 0 to datalist.count - 1 do
  begin
    if ContainsText(datalist[i],'Bad head') then
    begin
      memo1.Lines.Add(datalist[i]);
      
      // 替换原有CommaText解析逻辑
      eventlist.Clear;
      eventlist.Delimiter := ',';
      eventlist.StrictDelimiter := True;
      eventlist.DelimitedText := datalist[i];
      // 去除字段前后空白(可选)
      for j := 0 to eventlist.Count - 1 do
        eventlist[j] := Trim(eventlist[j]);

      Event[x].Dateofevent := eventlist[0];
      Event[x].Timeofevent := eventlist[1];
      Event[x].Version := eventlist[2];
      Event[x].Machine := Eventlist[3];
      Event[x].EventNumber := Eventlist[4];
      Event[x].EventName := Eventlist[5];
      Event[x].TableNumber := EventList[6];
      Event[x].Table := Eventlist[7];
      Event[x].Head := Eventlist[8];
      Event[x].Nozzle := EventList[9];
      Event[x].NozzleType := eventlist[10];
      Event[x].Lane := Eventlist[11];
      Event[x].PCBID := Eventlist[12];
      Event[x].Effect := Eventlist[13];

      memo1.Lines.Add('Date: '+Event[x].Dateofevent);
      memo1.Lines.Add('Time: '+Event[x].Timeofevent);
      memo1.Lines.Add('Machine: '+Event[x].Machine);
      memo1.Lines.Add('Event: '+Event[x].EventName);
      memo1.Lines.Add('Table: '+Event[x].Table);
      memo1.Lines.Add('Head: '+Event[x].Head);
      memo1.Lines.Add('Nozzle: '+Event[x].Nozzle);
      memo1.Lines.Add('Status: '+Event[x].Effect);

      x:=x+1;
    end;
  end;

  ShowMessage('lines: '+IntToStr(datalist.Count));
  datalist.Free;
  eventlist.Free; // 补充释放eventlist,避免内存泄漏
end;

额外说明

如果你的CSV后续可能出现**字段包含引号(比如"Bad head,nozzle detect")**这类复杂场景,建议使用专门的CSV解析库,或者自定义更完善的解析函数处理引号内的逗号,但当前场景下上述方案已足够解决问题。

内容的提问来源于stack exchange,提问作者user41758

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 05:50:27