Delphi: StringList Delimiter é sempre um personagem espacial, mesmo que o delimitador esteja definido
-
20-09-2019 - |
Pergunta
Estou tendo problemas com o delimitador na classe TStringlist. Dê uma olhada:
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]
Deve voltar 'foo bar'
sl[1]
Retorna 'foo'
Parece que o delimitador está agora '^'
E ' '
Alguma ideia?
Solução
Você deve definir s1.StrictDelimiter := True
Para que os espaços não sejam considerados delimitadores, mais informações aqui.
Como você trabalha em uma versão que não suporta o acima (como foi esclarecido após a apresentação da resposta), você tem duas opções:
- Encontre um personagem que você sabe que não será usado no texto original (por exemplo, sublinhado), converta todos os espaços para esse personagem antes de dividir e converter de volta após a divisão. Isto é Robosoftsugestão.
- Se você não tem vírgulas e espaços invertidos no texto, você pode usar Alexandertruque e embrulhar o texto entre delimitadores no comando invertido, para que
'hello hello^bye bye'
vira para'"hello hello"^"bye bye"'
. Se você escolher esse caminho e funcionar para você, aceite a resposta de Alexander e não o meu, ele também fornece o código para implementá -lo.
Ambas as soluções alternativas não usando StrictDelimiter
Tenha limitações: o primeiro requer algum caráter não utilizado, e o segundo não requer vírgulas e espaços invertidos no texto original.
Talvez seja hora de atualizar para uma versão mais recente do Delphi :)
Outras dicas
sl.DelimitedText := '"' + StringReplace(S, sl.Delimiter, '"' + sl.Delimiter + '"', [rfReplaceAll]) + '"';
Ryan tem um provedor uma excelente solução para esse problema usando a função ExtractStrings () em Delphi. Ver:
Portanto, no seu caso, substitua as chamadas para SL.Delimiter e SL.DelimitedText pela linha abaixo:Extractstrings (['^'], [], PChar (s), SL);
sl.Text := StringReplace(S, sl.Delimiter, sLineBreak, [rfReplaceAll]);
O trabalho está em Delphi 7 "como luvas" para mim. Esta é a minha função depois de aplicar o truque de 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;
Muito obrigado!