Delphi: StringList Delimiter é sempre um personagem espacial, mesmo que o delimitador esteja definido

StackOverflow https://stackoverflow.com/questions/1335027

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?

Foi útil?

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:

  1. 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.
  2. 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:

Analisando uma corda usando um delimitador para uma lista de TString, parece também analisar os espaços (Delphi)

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!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top