2
votes

I'm trying to parse a string with a TStringList:

  sl:=TStringList.Create;
  try
    sl.Text:=aString;
    FFirstRow:=sl[0];
    FSecondRow:=sl[1];
  finally
    sl.Free;
  end;

If aString:='aa'+#13#10+'bb' or aString:='aa'+sLineBreak+'bb' then FFirstRow is aa and FSecondRow is bb. But if aString:='aa\nbb'then FFirstRow gets the whole string (and there is no second row). How do I parse the string with \n as a delimiter?

I tried sl.Delimiter:=Char(13) (and sl.DelimitedText:=aString).

2
Since .Delimiter is one character and not a String (\n are two characters) you can't. But what keeps you from replacing all \n occurrances with #13#10 before?AmigoJack
This question is similar to stackoverflow.com/questions/15424293/… with the same valid answer.Uwe Raabe

2 Answers

4
votes

You can just change the string that is treated as the line break in a TStringList:

  sl := TStringList.Create;
  try
    sl.LineBreak := '\n';
    sl.Text := aString;
    FFirstRow := sl[0];
    FSecondRow := sl[1];
  finally
    sl.Free;
  end;
4
votes

The 2-character sequence '\'+'n' is not treated as an escape sequence in Delphi (only in C/C++, and only in compile-time literals, not in runtime data). You will have to replace the sequence manually, such as with StringReplace(), eg:

aString := 'aa\nbb';
sl := TStringList.Create;
try
  sl.Text := StringReplace(aString, '\n', #10, [rfReplaceAll]);
  FFirstRow := sl[0];
  FSecondRow := sl[1];
finally
  sl.Free;
end;