Delphi: TStringList delimitador es siempre un carácter de espacio, incluso si se establece el delimitador

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

Pregunta

Tengo problemas con el delimitador en la Clase TStringList. Echar un vistazo:

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] conveniente devolver 'foo bar'

sl[1] Función RETURN 'foo'

Parece que el delimitador está ahora '^' Y ' '

¿Alguna idea?

¿Fue útil?

Solución

Debe establecer s1.StrictDelimiter := True para espacios no deben ser considerados delimitadores, más información aquí .

Dado que se trabaja en una versión que no es compatible con lo anterior (como se aclaró después de la presentación de la respuesta), tiene dos opciones:

  1. Encuentre un personaje que sabe que no será utilizada en el texto original (por ejemplo, subrayado), convertir todos los espacios para que el personaje antes de separarse, y convertir de nuevo después de dividir. Esta es Robosoft sugerencia 's.
  2. Si usted no ha invertido comas y espacios en el texto, puede utilizar truco y envoltura Alexander 's el texto entre delimitadores en orden invertido, de manera que se convierte en 'hello hello^bye bye' '"hello hello"^"bye bye"'. Si elige este camino y que funciona para usted, por favor, acepte la respuesta de Alexander y no la mía, que también proporciona el código para ponerlo en práctica.

Las dos soluciones alternativas que no usan StrictDelimiter tienen limitaciones: la primera requiere un poco de carácter inusitado, y el segundo no requiere comas y espacios invertida en el texto original.

Tal vez sea hora de actualizar a una versión más reciente de Delphi:)

Otros consejos

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

Ryan tiene un excelente proveedor de solución a este problema usando ExtractStrings (función) en Delphi. Ver:

analizar una cadena utilizando un delimitador para una TStringList, parece que analizar también en espacios (Delphi)

Así pues, en su caso, sustituir las llamadas a sl.Delimiter y sl.DelimitedText con la línea de abajo: ExtractStrings ([ '^'], [], PChar (S), sl);

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

El trabajo de 7 en Delphi "como guantes" para mí. Este es mi función después de aplicar el truco de 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;

Muchas gracias!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top