54 votes

Delphi : StringList Delimiter est toujours un caractère espace même si Delimiter est défini

J'ai des problèmes avec le délimiteur dans la classe TStringList. Jetez un coup d'œil :

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] DEVRAIT retourner 'foo bar'

sl[1] DOES return 'foo'

Il semble que le délimiteur soit maintenant '^' ET ' '

Des idées ?

84voto

Roee Adler Points 10146

Vous devez définir s1.StrictDelimiter := True pour que les espaces ne soient pas considérés comme des délimiteurs, plus d'infos ici .

Comme vous travaillez dans une version qui ne prend pas en charge ce qui précède (comme cela a été précisé après la soumission de la réponse), vous avez deux options :

  1. Trouvez un caractère dont vous savez qu'il ne sera pas utilisé dans le texte d'origine (par exemple, un trait de soulignement), convertissez tous les espaces en ce caractère avant le fractionnement, et reconvertissez-le après le fractionnement. Ceci est robosoft La suggestion de la Commission.
  2. Si vous n'avez pas de guillemets et d'espaces dans le texte, vous pouvez utiliser Alexander et envelopper le texte entre les délimiteurs en commande inversée, de sorte que 'hello hello^bye bye' se tourne vers '"hello hello"^"bye bye"' . Si vous choisissez cette voie et que cela fonctionne pour vous, veuillez accepter la réponse d'Alexander et non la mienne, il fournit également le code pour la mettre en œuvre.

Les deux solutions de contournement n'utilisant pas StrictDelimiter ont des limites : la première exige un caractère inutilisé, et la seconde exige l'absence de guillemets et d'espaces dans le texte d'origine.

Il est peut-être temps de passer à une version plus récente de Delphi :)

18voto

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

5voto

Kashif Raja Points 31

Ryan a fourni une excellente solution à ce problème en utilisant la fonction ExtractStrings() dans Delphi. Voir :

Analyse syntaxique d'une chaîne utilisant un délimiteur dans une TStringList, semble également analyser les espaces (Delphi)

Donc, dans votre cas, remplacez les appels à sl.Delimiter et sl.DelimitedText par la ligne ci-dessous : ExtractStrings(['^'], [], PChar(S), sl) ;

3voto

user2933554 Points 11

Delphi 7 fonctionne pour moi "comme des gants". Voici ma fonction après avoir appliqué le truc d'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;

Merci beaucoup !

2voto

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X