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
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
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.
Si no funciona del todo bien, también hay versiones mejoradas en la red. – mj2008
@ 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. –
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
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;
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