項目数が異なる2種類のcsvファイルがあり、1行目にはヘッダー、2行目以降にデータが記載されています。
a.csv
ID,郵便番号,住所,氏名,年齢,職業,性別,備考
b.csv
ID,郵便番号,住所,氏名,性別,備考
csvファイルを読み込み、自動でaタイプかbタイプか判断し、内容を表示させたいと考えています。
一行目のヘッダーのみを読み込み、listで分解して、5番目の項目名でswitchさせれば実現できるかと思うのですが、具体的にどういうコードを書けばよいでしょうか?もっと簡便なアルゴリズムがあれば、そちらでもかまいません。
今回の条件だけであれば、7番目、8番目のカラムの存在の有無を調べて判定すれば良さそうに思います。
$fp = file('CSVファイル.csv', 'r');
if (!$fp && !feof($fp)) {
// ヘッダ行を読み込む
$line = fread($fp, 4096);
// 列をカンマで分解する
$column = explode(',', $line);
// ヘッダカラムの数で比較する
if( count($column) > 6 ) {
// a.csv タイプ
} else {
// b.csv タイプ
}
数だけで判断しても良いなら fgetcsv を使うと楽ですよ。
http://jp.php.net/manual/ja/function.fgetcsv.php
$handle = fopen("CSVファイル", "r"); $title = fgetcsv($handle, 1000, ","); if (count($title) == 8) { while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { // ID,郵便番号,住所,氏名,年齢,職業,性別,備考 用の処理 } } else { while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { // ID,郵便番号,住所,氏名,性別,備考 用の処理 } } fclose($handle);
ごめんなさい。動作テストはしてないです。
1000って数字は適当なので調整してね。
下のように替えてもいいかもです。
$title = fgets($handle); if ($title == 'ID,郵便番号,"住所","氏名","年齢","職業","性別","備考"') {
まだまだ、いろいろありそうだから、いろいろやってみて、
システムにあったものを選んでくださいね。
ん~、成る程。ヘッダーのカウントを取って、割り振ると。仮に項目の数が同じで並びが違うcsvデータを読むにしても、element[n]の比較を増やせば対応できそうですね。(´ー`)y-~~。
回答者 | 回答 | 受取 | ベストアンサー | 回答時間 | |
---|---|---|---|---|---|
1 | km1967 | 541回 | 450回 | 40回 | 2010-03-02 13:38:20 |
うーん、この例だと、帰ってくる数値は常に1のような気がするんだけど、
$line = fgetcsv($file, 1000, ",")
echo count($line);
で、カラム数というか、項目数が出ますよね。ただ、末尾のデータが空白だと、正確なカラム数が出ないです。(´ー`)y-~~。