2012-02-27 23 views
5

Este es mi texto delimitado: $ HEHDT, 10,17, 28 T * $ HEHDT, 10,18, T * 2A y así sucesivamente ...añadir más de 1 delimitador en TStringList

La coma es mi sentencia delimitador. Sin embargo, quiero usar el asterisco como mi delimitador también.

salida que quiero lograr es:

$ 10.17 HEHDT T $ 10.18 HEHDT T 2A

¿Cómo se especifica más de 1 delimitador de sentencia en Delphi? Este es el código que tengo hasta ahora.

var 
    MyStringList: TStringList; 
    i: Integer; 
begin 
    MyStringList:= TStringList.Create; 

    MyStringList.Delimiter := ',' 
    MyStringList.DelimitedText := '$HEHDT,10.17,T*28'+#13#10 +'$HEHDT,10.18,T*2A' +#13#10; 

    for i= 0 to MyStringList.Count-1 do 
    ShowMessage(MyStringList[i]); 

    MyStringList.Free; 
end; 

Para el código anterior, solo toma la coma como delimitador. ¿Cómo incluyo 2 delimitadores, tanto la coma como el asterisco?

¡Muchas gracias de antemano! =)

+0

¿Cuál es su versión de Delphi, por favor? – menjaraz

+0

Será mejor que use ExtractStrings para dividir las cadenas más capaces – OnTheFly

+0

@ user539484: Siempre que tenga la versión Delphi apropiada. – menjaraz

Respuesta

0

usted podría utilizar ReplaceString, cambiando todos los asteriscos a comas. Cambie su línea de asignación a esto:

String.DelimitedText := ReplaceString('$HEHDT,10.17,T*28'+#13#10 +'$HEHDT,10.18,T*2A', '*', 
         ',', [rfReplaceAll]); 

Su código anterior debería funcionar.

Nota: la propiedad DelimitedText, creo, también considera los espacios como delimitadores. Entonces, si la cadena tiene espacios, es posible que su código no se comporte de la manera en que podría esperar ...

+3

Si establece StrictDelimeter en True, no le dará ninguna pena con espacios. –

0
  1. La respuesta corta es NO.
  2. Pero puede usar una TStringList personalizada.

TStringList acepta uno y sólo un delimitador.

Extracto de Embarcadero RAD Studio Ayuda:

Classes.TStrings.DelimitedText

Descripción

representa todas las cadenas en los TStrings objeto como una sola cadena delimitada .

Uso DelimitedText para obtener o establecer todas las cadenas en los TStrings objeto en una sola cadena, separados por el carácter especificado por la propiedad delimitador.


Para poder utilizar más de un delimitadores que debe "extender" las capacidades de clase TStringList mediante la derivación de una nueva clase de ella.

Puede encontrar here un código fuente de muestra de una clase TStringListEx que tiene un comportamiento similar que puede adaptarse fácilmente a sus necesidades.

Extracto

TStringListEx = class(TStringList) 
private 
    FDelimiter: String; 
    function GetDelimitedText: String; 
    procedure SetDelimitedText(const Value: String); 
published 
    property Delimiter: String read FDelimiter write FDelimiter; 
    property DelimitedText: String read GetDelimitedText write SetDelimitedText; 
end; 

La solución que consiste en la cadena de procesamiento previo para establecer la propiedad TStringList.DelimitedText con el resto de los delimitadores (el primero que se puso a la propiedad TStringList.Delimeter) puede alcanzar su objetivo y aparte de las soluciones apuntadas en los mensajes de paulsm4 y Robert Frank también puede usar Expresión regular.

0

Puede usar dos listas de cadenas, una usando una coma, la otra usando un asterisco como delimitador. A continuación, asigne la propiedad de texto del primero a la propiedad de texto delimitado del segundo.

Cuestiones relacionadas