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
相关产品推荐
相关产品推荐

