Delphi: TStringList delimitatore è sempre un carattere di spazio, anche se è impostato delimitatore

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

Domanda

Ho problemi con il delimitatore nella classe TStringList. Date un'occhiata:

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] DOVREBBE restituire 'foo bar'

sl[1] fa ritorno 'foo'

Sembra che il delimitatore è ormai '^' E ' '

Tutte le idee?

È stato utile?

Soluzione

È necessario impostare s1.StrictDelimiter := True per spazi non devono essere considerati delimitatori, maggiori informazioni qui .

Dal momento che si lavora in una versione che non supporta quanto sopra (come è stato chiarito dopo la risposta è stata presentata), avete due opzioni:

  1. Trova un personaggio si sa non sarà utilizzato nel testo originale (ad esempio sottolineatura), convertire tutti gli spazi a quel personaggio prima di sciogliersi, e convertire indietro dopo la divisione. Questo è Robosoft suggerimento s '.
  2. Se non avete invertito le virgole e gli spazi nel testo, è possibile utilizzare trucco e avvolgere Alexander 's il testo tra i delimitatori di comando invertito, in modo che si rivolge a 'hello hello^bye bye' '"hello hello"^"bye bye"'. Se si sceglie questa strada e funziona per voi, vi prego di accettare la risposta di Alessandro e non la mia, egli fornisce anche il codice per la sua attuazione.

Entrambe le soluzioni alternative che non utilizzano StrictDelimiter hanno dei limiti: il primo richiede un po 'di carattere non utilizzati, e la seconda non richiede virgolette e gli spazi nel testo originale.

Forse è il momento di passare a una versione più recente di Delfi:)

Altri suggerimenti

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

Ryan ha un eccellente fornitore di soluzione a questo problema utilizzando ExtractStrings (funzione) in Delphi. Vedi:

L'analisi di una stringa utilizzando un delimitatore per un TStringList, sembra analizzare anche su spazi (Delphi)

Quindi nel tuo caso, sostituire le chiamate a sl.Delimiter e sl.DelimitedText con la linea di seguito: ExtractStrings ([ '^'], [], PChar (S), sl);

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

Il lavoro di in Delphi 7 "come guanti" per me. Questa è la mia funzione dopo applicare trucco di Alessandro:

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;

Grazie mille!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top