ホーム アプリケーション ライブラリ 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 賛歌 |