2011-06-10 11 views
7

Solo necesito dividir una cadena como: "STANS", "Payment, chk#1", ,1210.000 en una matriz basada en ,. El resultado en la lista cadena seríaCómo dividir la cadena en delphi

STANS 
Payment, chk#1 

1210.000 
+0

Esta no es una respuesta, pero no puedo hacer un comentario sin embargo ... ¿Cómo puedo hacer lo mismo pero en lugar de "," tener ";" ... Gracias – azrael11

Respuesta

12

Crear una TStringList y asignar su cadena separada por comas de StringList.CommaText. Esto analiza su entrada y devuelve las cadenas divididas como los elementos de la lista de cadenas.

StringList.CommaText := '"STANS", "Payment, chk# 1", ,1210.000'; 
//StringList[0]='STANS' 
//StringList[1]='Payment, chk# 1' 
//etc. 
+0

Si no funciona del todo bien, también hay versiones mejoradas en la red. – mj2008

+1

@ mj2008 ¿Podría elaborar por favor? Este código funciona bien en el ejemplo dado. Si va a desaprobar una respuesta, es mejor proporcionar alguna evidencia. Si tienes pruebas, seré felizmente corregido. –

+1

Te he votado y creo que es la respuesta correcta. ¡No quería "desacreditarte"! Tengo una TStringCSVList de Magenta Systems que hace algunas mejoras de espacio, pero es de 2000, así que tal vez la implementación actual de Delphi sea mejor. Para un buen CSV, Delphi está fuera de la caja. Para el CSV dudoso, hay cosas similares por ahí. – mj2008

2

escribí esta función y funciona perfecto para mí en Delphi 2007

function ParseCSV(const S: string; ADelimiter: Char = ','; AQuoteChar: Char = '"'): TStrings; 
type 
    TState = (sNone, sBegin, sEnd); 
var 
    I: Integer; 
    state: TState; 
    token: string; 

    procedure AddToResult; 
    begin 
     if (token <> '') and (token[1] = AQuoteChar) then 
     begin 
     Delete(token, 1, 1); 
     Delete(token, Length(token), 1); 
     end; 
     Result.Add(token); 
     token := ''; 
    end; 

begin 
    Result := TstringList.Create; 
    state := sNone; 
    token := ''; 
    I := 1; 
    while I <= Length(S) do 
    begin 
    case state of 
     sNone: 
     begin 
      if S[I] = ADelimiter then 
      begin 
      token := ''; 
      AddToResult; 
      Inc(I); 
      Continue; 
      end; 

      state := sBegin; 
     end; 
     sBegin: 
     begin 
      if S[I] = ADelimiter then 
      if (token <> '') and (token[1] <> AQuoteChar) then 
      begin 
       state := sEnd; 
       Continue; 
      end; 

      if S[I] = AQuoteChar then 
      if (I = Length(S)) or (S[I + 1] = ADelimiter) then 
       state := sEnd; 
     end; 
     sEnd: 
     begin 
      state := sNone; 
      AddToResult; 
      Inc(I); 
      Continue; 
     end; 
    end; 
    token := token + S[I]; 
    Inc(I); 
    end; 
    if token <> '' then 
    AddToResult; 
    if S[Length(S)] = ADelimiter then 
    AddToResult 
end;