エクセルから書き出したcsvの読み込み

ブログ | 2011/8/10 13:46
phpには、fgetcsv() といった関数もあるけれど、"で囲われてたり囲われてなかったりするcsvだと、いまいちうまくいかない印象。

だいたいのcsvのやりとりは、エクセルからの書き出しになるから、SJISで改行や,を内包するときだけ、""で囲われる。(セル内の改行と行末の改行がどうもやっかいなのです。)

で、結局、こんな感じで行を配列に入れた。

<?php

$str = file_get_contents('xxxxx.csv');
$str = str_replace(array("\x0d\x0a", "\x0a", "\x0d"), PHP_EOL, $str);
$str = mb_convert_encoding($str,'UTF-8','SJIS');

//セル内の改行をひとまず[br]に置換
$str = preg_replace_callback('/(?:^|,)"((?:[^"]|"")*)"/s',
        create_function(
          '$matches',
          'return strtr($matches[0],array(PHP_EOL=>"[br]"));'
        ),
      $str);

//行末改行で区切って行を配列に
$lines = explode(PHP_EOL,$str);

//セル内の[br]を改行に戻す
$lines = array_map(create_function('$v', 'return strtr($v,array("[br]"=>PHP_EOL));'),$lines);

print_r($lines);


//セルの抜き出して処理
foreach($lines as $line){
 preg_match_all('/(?:^|,)(?:"((?:[^"]|"")*)"|([^,"]*))/s',$line,$matches);
 print_r($matches);
}

?>
タグ
縮小 拡大

ログインしておくと、後で編集が可能です。

Rottel内コンテンツ

ユーザー一覧

Rottelとは?
利用規約
開発飲料
利用者の声
ヘルプ
close