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?
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:
- 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 .
- 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:)
sl.DelimitedText := '"' + StringReplace(S, sl.Delimiter, '"' + sl.Delimiter + '"', [rfReplaceAll]) + '"';
Ryan a Fournisseur une excellente solution à ce problème en utilisant la fonction ExtractStrings() dans Delphi. Voir:
dans votre cas, remplacez les appels à sl.Delimiter et sl.DelimitedText avec la ligne ci-dessous: extraits(['^'], [], PChar (S), sl);
sl.Text := StringReplace(S, sl.Delimiter, sLineBreak, [rfReplaceAll]);
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!