2011-06-10 165 views
7

我只需要將一個字符串如:"STANS", "Payment, chk#1", ,1210.000拆分爲基於,的數組。在字符串列表中的結果將是如何在delphi中拆分字符串

STANS 
Payment, chk#1 

1210.000 
+0

這不是一個答案,但我不能作出評論尚未...我 怎麼可以這樣做,但取而代之的是「,」有「;」... 謝謝 – azrael11 2011-06-10 06:49:02

回答

12

創建TStringList並分配逗號分隔字符串StringList.CommaText。這將解析您的輸入並將拆分字符串作爲字符串列表的項目返回。

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

如果它不能正常工作,網絡上也有改進的版本。 – mj2008 2011-06-10 08:43:27

+1

@ mj2008請您詳細說明一下嗎?此代碼在給出的示例中正常工作。如果你打算揭穿答案,最好提供一些證據。如果你有證據,那麼我會非常高興地立場糾正。 – 2011-06-10 08:52:24

+1

我向你投了贊,並認爲這是正確的答案。我不是爲了「揭穿」你!我有一個來自Magenta Systems的TStringCSVList,它有一些空間的改進,但它是從2000年開始的,所以也許現在的Delphi實現更好。對於良好的CSV,Delphi是很好的開箱即用的。對於狡猾的CSV,那裏有類似的東西。 – mj2008 2011-06-10 09:08:55

2

我寫了這個功能和完美的作品,我在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;