Question

Je ne parviens pas à le delimiter dans la classe TStringList. Jetez un coup d'oeil:

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] FONCTIONNE 'foo' retour

Il semble que le séparateur est '^' maintenant ET ' '

Toutes les idées?

Était-ce utile?

La solution

Vous devez définir s1.StrictDelimiter := True pour les espaces de ne pas être considérés comme délimiteurs, plus d'infos ROBOSOFT suggestion .

  • Si vous ne l'avez pas inversé des virgules et des espaces dans le texte, vous pouvez utiliser astuce de Alexander et wrap le texte entre des délimiteurs de commande inversé, de sorte que 'hello hello^bye bye' se tourne vers '"hello hello"^"bye bye"'. Si vous choisissez cette voie et il fonctionne pour vous, s'il vous plaît accepter la réponse d'Alexandre et pas le mien, il fournit également le code pour la mettre en œuvre.
  • Les deux solutions de contournement n'utilisent pas StrictDelimiter ont des limites: la première exige un certain caractère utilisé, et la seconde ne nécessite pas des virgules et des espaces inversé dans le texte original.

    Peut-être qu'il est temps de passer à une version plus récente de Delphi:)

    Autres conseils

    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:

    une chaîne en utilisant Parsing un séparateur à un TStringList, semble analyser aussi sur les espaces (Delphi)

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

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

    Les travaux de Delphi 7 « comme des gants » pour moi. Ceci est ma fonction applique après Trick 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!

    Licencié sous: CC-BY-SA avec attribution
    Non affilié à StackOverflow
    scroll top