【问题标题】:How to split the string in delphidelphi中如何分割字符串
【发布时间】:2011-09-12 05:14:45
【问题描述】:

我只需要将类似"STANS", "Payment, chk#1", ,1210.000 的字符串拆分为基于, 的数组。字符串列表中的结果将是

STANS  
Payment, chk#1  

1210.000

【问题讨论】:

  • 这不是一个答案,但我还不能发表评论......我怎么能做同样的事情,而不是“,”有“;”......谢谢你

标签: delphi delphi-2010


【解决方案1】:

创建一个TStringList 并将逗号分隔的字符串分配给StringList.CommaText。这会解析您的输入并将拆分的字符串作为字符串列表的项目返回。

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

【讨论】:

  • 如果不能正常使用,网上也有改进的版本。
  • @mj2008 你能详细说明一下吗?此代码在给出的示例上运行良好。如果您要揭穿答案,最好提供一些证据。如果您有证据,那么我将非常乐意纠正。
  • 我支持你,并认为这是正确的答案。我不是来“揭穿”你的!我有一个来自 Magenta Systems 的 TStringCSVList,它做了一些空间改进,但它是从 2000 年开始的,所以当前的 Delphi 实现可能更好。对于好的 CSV,Delphi 开箱即用。对于狡猾的 CSV,也有类似的东西。
  • @"David Heffernan" 如果字符串在逗号之间包含空格,但没有双引号,您将如何处理?例如,我将“900 024000649314,2015/07/04,08:23:12”作为我行的第一部分。如果我执行以下操作: ShowMessage(StringList[0]);它仅输出 900。提前致谢!
  • @DJSquared 将StrictDelimiter 设置为True
【解决方案2】:

我在 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-07
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-30
    相关资源
    最近更新 更多