PHP, C# での Excel準拠 CSV ファイルのパース処理

前回 id:fits:20101129 の続きで、Excel の仕様に準拠した CSV ファイル(改行・カンマ・ダブルクォーテーションを要素内に含む)をパースするサンプルの PHPC# 版です。

使用する CSV ファイルや出力結果の例は、前回 id:fits:20101129 を参照。

サンプルのソースは http://github.com/fits/try_samples/tree/master/blog/20101204/

PHP の場合

PHP では標準で用意されている fgetcsv を使います。

parse_csv.php
<?php
if (($h = fopen($argv[1], "r")) !== FALSE) {
    while (($r = fgetcsv($h)) !== FALSE) {
        echo "$r[0] : $r[2]\n";
    }
    fclose($h);
}

str_getcsv というのもありますが、これは 1行分の文字列を処理するために使います。

以下の環境で実行してみました。

  • PHP 5.3.3 Win32 VC9
実行例
> php parse_csv.php test.csv

C# の場合

C# というか .NET では、Microsoft.VisualBasic.FileIO.TextFieldParser を使えば、今回のような CSV ファイルを処理できます。
デフォルト設定だとファイルの文字コードUTF-8 で処理されてしまうので、エンコードを指定しています。

parse_csv.cs
using System;
using System.Text;
using Microsoft.VisualBasic.FileIO;

class CSVParse
{
    public static void Main(string[] args)
    {
        using (var reader = new TextFieldParser(args[0], Encoding.Default))
        {
            //区切り文字を設定する必要あり
            reader.SetDelimiters(",");

            while (!reader.EndOfData)
            {
                var r = reader.ReadFields();
                Console.WriteLine("{0} : {1}", r[0], r[2]);
            }
        }
    }
}

以下の環境でビルド実行してみました。

実行例
> csc /r:Microsoft.VisualBasic.dll parse_csv.cs
> parse_csv.exe test.csv