UFO ET IT

Delphi : StringList Delimiter는 Delimiter가 설정되어 있어도 항상 공백 문자입니다.

ufoet 2021. 1. 12. 08:10
반응형

Delphi : StringList Delimiter는 Delimiter가 설정되어 있어도 항상 공백 문자입니다.


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'

구분자가 이제 '^'AND 인 것 같습니다.' '

어떤 아이디어?


s1.StrictDelimiter := True공백이 구분자로 간주되지 않도록 설정해야 합니다 . 자세한 내용은 여기에서 확인하세요 .

위를 지원하지 않는 버전에서 작업하기 때문에 (답변을 제출 한 후 명확하게 설명한대로) 두 가지 옵션이 있습니다.

  1. 원본 텍스트 (예 : 밑줄)에서 사용되지 않을 것으로 알고있는 문자를 찾고 분할하기 전에 모든 공백을 해당 문자로 변환 한 다음 분할 후 다시 변환하십시오. 이것은 robosoft 의 제안입니다.
  2. 당신은 텍스트에 인용 부호와 공백이없는 경우 사용할 수 있습니다 알렉산더 그래서,의 트릭과 반전 명령 구분 기호 사이의 텍스트 줄 바꿈 'hello hello^bye bye'회전에 '"hello hello"^"bye bye"'. 이 경로를 선택하고 작동하는 경우 내 것이 아닌 Alexander의 대답을 수락하십시오. 그는 또한 그것을 구현하는 코드를 제공합니다.

사용하지 않는 두 가지 해결 방법 StrictDelimiter에는 제한이 있습니다. 첫 번째 해결 방법에는 사용 하지 않은 문자가 필요하고 두 번째 해결 방법 에는 원래 텍스트에 반전 된 쉼표와 공백이 필요하지 않습니다.

아마도 델파이의 최신 버전으로 업그레이드 할 때입니다. :)


sl.DelimitedText := '"' + StringReplace(S, sl.Delimiter, '"' + sl.Delimiter + '"', [rfReplaceAll]) + '"';

Ryan은 Delphi에서 ExtractStrings () 함수를 사용하여이 문제에 대한 훌륭한 솔루션을 제공합니다. 보다:

구분 기호를 사용하여 TStringList에 대한 문자열을 구문 분석하는 것은 공백에서도 구문 분석하는 것 같습니다 (Delphi).

따라서 귀하의 경우 sl.Delimiter 및 sl.DelimitedText에 대한 호출을 아래 줄로 바꿉니다. ExtractStrings ([ '^'], [], PChar (S), sl);


sl.Text := StringReplace(S, sl.Delimiter, sLineBreak, [rfReplaceAll]);

작업은 Delphi 7에서 "장갑처럼"입니다. 이것은 Alexander의 Trick을 적용한 후의 내 기능입니다.

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;

감사합니다!

참조 URL : https://stackoverflow.com/questions/1335027/delphi-stringlist-delimiter-is-always-a-space-character-even-if-delimiter-is-se

반응형