| ホーム アプリケーション ライブラリ Tips くだらないTips リンク集 Borland 賛歌 |
![]() |
|
■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 賛歌 |