2011年10月25日火曜日

fgetcsvを使って、CSVからXMLを作ったが・・。

fgetcsvはCSVデータを処理するのに便利な関数ですが、Excelから書き出したCSVデータをXMLにマップしなおす中ではまった事例を少し。

PHPのマニュアルにもありますが、

$row 1;
if ((
$handle fopen("test.csv""r")) !== FALSE) {
    while ((
$data fgetcsv($handle1000",")) !== FALSE) {
        
$num count($data);
        echo 
"<p> $num fields in line $row: <br /></p>\n";
        
$row++;
        for (
$c=0$c $num$c++) {
            echo 
$data[$c] . "<br />\n";
        }
    }
    
fclose($handle);
}
http://php.net/manual/ja/function.fgetcsv.php

こんな感じでCSVを読み出していくと思うのですが、Excelで書き出したCSVが以下みたいな感じだったとき、

ヘッダ1,ヘッダ2,日付,項目
ほげほげ,だよだよ,2011/10/25,ああああああ

コレがなぜか一文字目が文字化けしてしまう!
まずは文字コード(SJIS,SJIS-win,UTF-8の組み合わせ)を疑ってみたものの解決せず。

ほげほげ→wげほげ
みたいな形で表示されちゃうんですよ。
CSVの文字コードはSJIS、プログラムはUTF-8。んー。CSVを以下に変更。

"ほげほげ","だよだよ","2011/10/25","ああああああ"


ダブルコーテーションで囲ってみたところ・・・

ほげほげ
きちんと表示されるようになりました。SJISのCSVの場合、そのまま読み出してmb_convert_encodingでechoしてもうまくいかない模様。EUCもだめっぽいようで、fgetcsvでうまく使えるのはUTF-8の時だけのようだ。

・ダブルコーテーションで囲む。
または
・SJISで保存しない、UTF-8で保存。

が解決のポイントかも。意外に基礎っぽいところで躓きます。

0 件のコメント:

コメントを投稿