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

j'ai des problèmes avec le délimiteur de la classe TStringList. Regardez:

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

sl[1] FAIT retour 'foo'

il semble que le délimiteur soit maintenant '^' et ' '

des idées?

51
demandé sur Blorgbeard 2009-08-26 18:16:08

5 réponses

vous devez définir s1.StrictDelimiter := True pour les espaces qui ne doivent pas être considérés comme des délimiteurs, plus d'informations ici .

puisque vous travaillez dans une version qui ne supporte pas ce qui précède( comme cela a été clarifié après que la réponse a été soumise), vous avez deux options:

  1. trouver un caractère que vous savez ne sera pas utilisé dans le texte original (par exemple souligné), convertir tous les espaces à ce caractère avant de se séparer, et de convertir en arrière après fractionnement. C'est la suggestion de robosoft .
  2. si vous n'avez pas inversé les virgules et les espaces dans le texte, vous pouvez utiliser Alexander de l 'astuce et envelopper le texte entre les délimiteurs dans la commande inversée, de sorte que 'hello hello^bye bye' se transforme en '"hello hello"^"bye bye"' . Si vous choisissez cette voie et qu'elle fonctionne pour vous, veuillez accepter la réponse D'Alexander et non la mienne, il fournit également le code pour l'appliquer.

Les deux solutions de rechange qui n'utilisent pas StrictDelimiter ont des limites: la première nécessite un certain caractère inutilisé, et la seconde ne nécessite pas de virgule et d'espaces inversés dans le texte original.

peut-être qu'il est temps de passer à une nouvelle version de Delphi:)

81
répondu Roee Adler 2017-05-23 11:47:14
sl.DelimitedText := '"' + StringReplace(S, sl.Delimiter, '"' + sl.Delimiter + '"', [rfReplaceAll]) + '"';
18
répondu Alex 2009-08-26 15:56:17

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

analyser une chaîne en utilisant un délimiteur vers une TStringList, semble aussi analyser des espaces (Delphi)

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

4
répondu Kashif Raja 2017-05-23 12:17:54
sl.Text := StringReplace(S, sl.Delimiter, sLineBreak, [rfReplaceAll]);
2
répondu barbaris 2013-05-22 15:31:45

travail à Delphi 7 "comme des gants" pour moi. C'est ma fonction Après appliquer le tour D'Alexandre:

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!

2
répondu user2933554 2013-10-29 18:55:07