2011-06-10 24 views
7

Sadece "STANS", "Payment, chk#1", ,1210.000 gibi bir dizeyi , tabanlı bir diziye bölmem gerekiyor. dizisi listesindeki sonuçDelphi içinde dize bölme

STANS 
Payment, chk#1 

1210.000 
+0

benim için mükemmel çalışıyor ... ben de aynısını yapabilirsiniz nasıl ama Bunun yerine, "," var ";" ... Teşekkür ederim – azrael11

cevap

12

bir TStringList oluşturun ve virgül StringList.CommaText dize ayrılmış atamak olacaktır. Bu, girişinizi ayrıştırır ve bölünmüş dizeleri dize listesinin öğeleri olarak döndürür.

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

Çok düzgün çalışmıyorsa, ağda geliştirilmiş sürümler de var. – mj2008

+1

@ mj2008 Ayrıntılı bilgi verir misiniz lütfen? Bu kod verilen örnekte iyi çalışıyor. Bir cevabı çıkarırsanız, bazı kanıtlar sunmak daha iyidir. Eğer kanıtınız varsa o zaman çok mutlu olurum. –

+1

Seni destekledim ve doğru cevap olduğunu düşünüyorum. Seni "debunk" etmek için dışarı çıkmadım! Magenta Systems'tan bazı alan geliştirmeleri yapan bir TStringCSVList'im var, ancak 2000'den beri mevcut Delphi uygulaması daha iyi. İyi bir CSV için, Delphi kutunun dışındadır. Tehlikeli CSV için, orada benzer şeyler var. – mj2008

2

Ben Bu bir cevap değil ama henüz bir yorum yapamaz bu fonksiyonu yazdım ve 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;