ホーム  アプリケーション  ライブラリ  Tips  くだらないTips  リンク集  Borland 賛歌
hydez

Tips

■Excel で出力した CSV を取り込みたい。
VCL の TStrings を継承したクラスには CommaText というメソッドがありますが、
このメソッドではExcel で出力した CSV は正しく取り込めない場合があります。
Excel では半角スペースを含んだ文字列をそのままで出力しますが、
CommaText では半角スペースを区切り文字と判定してしまうからです。
そこで私は、次のような関数で解析しています。
禁じ手 goto は使っていますが...

引数
pCSV : CSV 一行の文字列
pResult : 結果を戻すためのストリングリスト
procedure ParseExcelCSV(const pCSV:WideString; pResult:TStrings);
label
OUTQUOTE, INQUOTE;
var
aSrc, aAdd:WideString;
aLength, aIndex:Integer;
begin
  pResult.Clear();
  aSrc    := pCSV + WideString( ',' );
  aLength := Length( aSrc );
  aAdd    := '';
  aIndex  := 1;
OUTQUOTE:
  if aLength < aIndex then Exit
  else if aSrc[ aIndex ] = '"' then begin
    Inc( aIndex );
    goto INQUOTE;
    end else if aSrc[ aIndex ] = ',' then begin
    pResult.Add( aAdd ); aAdd := ''; Inc( aIndex ); goto OUTQUOTE;
    end else begin
    aAdd := aAdd + aSrc[ aIndex ]; Inc( aIndex ); goto OUTQUOTE;
  end;
INQUOTE:
  if aLength < aIndex then Exit
  else if aSrc[ aIndex ] = '"' then begin
    if aSrc[ aIndex + 1 ] = '"' then begin
      aAdd := aAdd + WideString( '"' ); Inc( aIndex, 2 ); goto INQUOTE;
    end else begin
      Inc( aIndex ); goto OUTQUOTE;
    end;
  end else begin
    aAdd := aAdd + aSrc[ aIndex ]; Inc( aIndex ); goto INQUOTE;
  end;
end;
          
ホーム  アプリケーション  ライブラリ  Tips  くだらないTips  リンク集  Borland 賛歌