2009-08-26 43 views
48

Tengo problemas con el delimitador de la clase TStringList. Echar un vistazo:Delphi: StringList Delimiter es siempre un carácter de espacio incluso si Delimiter está configurado

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

sl[1] Función RETURN 'foo'

Parece que el delimitador es ahora '^' Y ' '

¿Alguna idea?

+0

¿En qué versión de Delphi está trabajando? –

+0

Estoy trabajando en Delpi 7 – Acron

+0

posible duplicado de [Dividir una cadena en una matriz de cadenas basadas en un delimitador] (http://stackoverflow.com/questions/2625707/split-a-string-into-an-array -of-strings-based-on-a-delimiter) – Ampere

Respuesta

77

Debe establecer s1.StrictDelimiter := True para que los espacios no se consideren delimitadores, más información here.

ya 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. encontrar a un personaje que sabe que no va a ser utilizado en el original texto (por ejemplo, subrayado), convierta todos los espacios a ese carácter antes de dividir y convierta de nuevo después de la división. Esta es la sugerencia de robosoft.
  2. Si usted no ha invertido comas y espacios en el texto, puede utilizar truco Alexander 's y envolver el texto entre delimitadores al mando invertida, de manera que se vuelve a 'hello hello^bye bye''"hello hello"^"bye bye"'. Si elige esta ruta y le conviene, acepte la respuesta de Alexander y no la mía, también proporciona el código para implementarla.

Ambas 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.

quizás es el momento para actualizar a una nueva versión de Delphi :)

+0

¡Bummer! Cualquier punto de partida de solución? – Acron

+1

¿Qué es lo que quiere trabajar? Parece una solución para mí. – jpfollenius

+5

Tengo Delphi 7, así que esto no funciona para mí. – Acron

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

Mierda, me ganaste, estaba escribiendo exactamente la misma respuesta :) –

+0

Muy inteligente, gracias Alexander, así como The_Fox, incluso si no me ayudaste directamente, pero tu intención era hacerlo :) – Acron

+3

+1 Muy agradable, pero tiene un problema si la cadena original contiene una subsección como '""' (es decir, comas y espacios invertidos en el texto) –

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

Probablemente deberías agregar una explicación sobre lo que está haciendo. – FDinoff

2

Obra en Delphi 7 "like gloves" para mí. Esta 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!

+0

Es una solución, no una solución. – Paul

Cuestiones relacionadas