一个CSV格式的字符串,如下:
9X4524LA-MFO,"KNIT SHIRT, WOVEN SHORT",116,CN我想为为每一段加上双引号,即"",变成:
"9X4524LA-MFO","KNIT SHIRT, WOVEN SHORT","116","CN"要注意:
1. 是一个标准的CSV格式
2. 可能有一些段已包含""("KNIT SHIRT, WOVEN SHORT")
3.可能一些段中包含逗号(见"KNIT SHIRT, WOVEN SHORT")

解决方案 »

  1.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      I: Integer;
      S: string;
    begin
      S := '';
      with TStringList.Create do try
        Delimiter := ',';
        QuoteChar := '"';
        DelimitedText := '9X4524LA-MFO,"KNIT SHIRT, WOVEN SHORT",116,CN';
        for I := 0 to Count - 1 do
          if Pos('"', Strings[I]) <= 0 then
            S := S + Delimiter + AnsiQuotedStr(Strings[I], QuoteChar)
          else S := S + Delimiter + Strings[I];
        System.Delete(S, 1, Length(Delimiter));
      finally
        Free;
      end;
      ShowMessage(S);
    end;
      

  2.   

    楼上的代码写好好精干
    谁能帮忙解释一下吗?
    AnsiQuotedStr和Delete我都知道
    但是我就写不出这样的代码
    不愧是4星用户啊!!
      

  3.   

    期待高手点解一下
    with TStringList.Create do
    这样用是什么意思啊?
      

  4.   

    with 语句没有用过吗?就是说下面有的属性是 TStringList类的。
      

  5.   

    感謝、佩服 zswang(伴水清清)(专家门诊清洁工)!
    代碼寫得太精干了,非常好的利用了VCL!
      

  6.   

    to zswang:
    因为我在大富翁也开了贴问此问题,所以现在把你这个最好的答案也转贴到了过去:
    http://www.delphibbs.com/delphibbs/DispQ.asp?LID=2970299
      

  7.   

    to zswang:
    发现了一个新问题:如果源字符串中包含了"呢?因为标准CSV格式是允许包含"的,只不过得成双出现,如下:9X4524LA-MFO,"KNIT SHIRT, WOVEN SHORT",116,CN,"""afdasf"请你好人做到底:)帮忙再花一点点脑筋:)
      

  8.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      I: Integer;
      S: string;
    begin
      S := '';
      with TStringList.Create do try
        Delimiter := ',';
        QuoteChar := '"';
        DelimitedText := '9X4524LA-MFO,"KNIT SHIRT, WOVEN SHORT",116,CN,"""afdasf"""';
        for I := 0 to Count - 1 do
          S := S + Delimiter + AnsiQuotedStr(Strings[I], QuoteChar);
        System.Delete(S, 1, Length(Delimiter));
      finally
        Free;
      end;
      ShowMessage(S);
    end;
      

  9.   

    大受大击呀!
    我也改好了,但代码多了,而zswang大虾的反而代码更精简了! :(
    zswang!厉害!
      

  10.   

    我知道
    with a do
    begin
      aa
    end;
    表示aa属于a的一个属性和方法
    但是我说的是
    with TStringList.Create do
    这样(TStringList.Create)用是什么意思啊?
    procedure TForm1.Button1Click(Sender: TObject);
    var
      I: Integer;
      S: string;
    begin
      S := '';
      with TStringList.Create do try
        Delimiter := ',';
        QuoteChar := '"';
        DelimitedText := '9X4524LA-MFO,"KNIT SHIRT, WOVEN SHORT",116,CN';
        for I := 0 to Count - 1 do
          if Pos('"', Strings[I]) <= 0 then
            S := S + Delimiter + AnsiQuotedStr(Strings[I], QuoteChar)
          else S := S + Delimiter + Strings[I];
        System.Delete(S, 1, Length(Delimiter));
      finally
        Free;
      end;
      ShowMessage(S);
    end;这个Count是TStringList的方法或属性
    而不是TStringList.creat的方法或属性吧???
      

  11.   

    to 楼上的:
    TStringList.Create返回一个TStringList类型的实例,Count就是这个实例的属性。to zswang:
    又出现新的问题了:
    如果把
    '9X4524LA-MFO,"KNIT SHIRT, WOVEN SHORT",116,CN,"""afdasf"""'
    改成
    '9X452 4LA-MFO,"KNIT SHIRT, WOVEN SHORT",116,CN,"""afdasf"""'
    即有空格而没有被括住,结果会变成:
    "9X452","4LA-MFO","""KNIT SHIRT, ""WOVEN SHORT""","116","CN"
    我想到了解决方法,就是先临时把所有空格代码替换为另一个串,最后再替换回来。
    但我想看看zswang的更优雅的方法。