Delphi : StringList Delimiter는 Delimiter가 설정되어 있어도 항상 공간 문자입니다.
-
20-09-2019 - |
문제
나는 tstringlist 클래스의 구분 기에 어려움을 겪고 있습니다. 구경하다:
var
s: string;
sl: TStringList;
begin
sl := TStringList.Create;
s := 'Users^foo bar^bar foo^foobar^barfoo';
sl.Delimiter := '^';
sl.DelimitedText := s;
ShowMessage(sl[1]);
end;
sl[1]
돌아와야합니다 'foo bar'
sl[1]
돌아온다 'foo'
현재 구분표가있는 것 같습니다 '^'
그리고 ' '
어떤 아이디어?
해결책
당신은 설정해야합니다 s1.StrictDelimiter := True
구분자로 간주되지 않는 공백의 경우 더 많은 정보 여기.
위의 지원을 지원하지 않는 버전으로 작업하므로 (답변이 제출 된 후 명확해진대로) 두 가지 옵션이 있습니다.
- 원본 텍스트 (예 : 밑줄)에서 사용되지 않는 캐릭터를 찾아서 분할하기 전에 모든 공백을 해당 문자로 변환 한 후 분할 후 다시 변환하십시오. 이것은 Robosoft제안.
- 텍스트에 반전 된 쉼표와 공간이없는 경우 사용할 수 있습니다. 알렉산더거꾸로 명령으로 구분자 사이에 텍스트를 랩핑하여
'hello hello^bye bye'
돌아옵니다'"hello hello"^"bye bye"'
. 이 경로를 선택하고 그것이 당신을 위해 작동한다면, Alexander의 답변을 받아들이고 내 것이 아니라, 그는 그것을 구현하기위한 코드도 제공합니다.
두 해결 방법은 사용하지 않습니다 StrictDelimiter
제한 사항이 있습니다 : 첫 번째는 사용하지 않은 문자가 필요하며 두 번째는 원본 텍스트에서 거꾸로 된 쉼표와 공간이 필요하지 않습니다.
아마도 새로운 버전의 델파이로 업그레이드 할 때가되었을 것입니다 :)
다른 팁
sl.DelimitedText := '"' + StringReplace(S, sl.Delimiter, '"' + sl.Delimiter + '"', [rfReplaceAll]) + '"';
Ryan은 Delphi의 ExtractStrings () 기능을 사용 하여이 문제에 대한 훌륭한 솔루션을 제공합니다. 보다:
Delimiter를 TSTRINGLIST에 사용하여 문자열을 구문 분석하는 것은 공백 (Delphi)을 구문 분석하는 것 같습니다.
따라서 귀하의 경우 전화를 SL.Delimiter 및 SL.DelimitedText로 바꾸십시오.ExtractStrings ([ '^'], [], pchar (s), sl);
sl.Text := StringReplace(S, sl.Delimiter, sLineBreak, [rfReplaceAll]);
일하는 것은 Delphi 7 "Like Like Gloves"에서 나에게 있습니다. 이것은 Alexander의 트릭을 적용한 후 내 기능입니다.
procedure Split (const Delimiter: Char; Input: string; const Strings: TStrings) ;
begin
Assert(Assigned(Strings)) ;
Strings.Clear;
Strings.Delimiter := Delimiter;
Strings.DelimitedText := '"' + StringReplace(Input, Delimiter, '"' + Delimiter + '"', [rfReplaceAll]) + '"' ;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text := 'Users^foo bar^bar foo^foobar^barfoo';
Split('^',Edit1.Text,Memo1.Lines);
end;
정말 감사합니다!