PHPの質問です。

項目数が異なる2種類のcsvファイルがあり、1行目にはヘッダー、2行目以降にデータが記載されています。
a.csv
ID,郵便番号,住所,氏名,年齢,職業,性別,備考
b.csv
ID,郵便番号,住所,氏名,性別,備考

csvファイルを読み込み、自動でaタイプかbタイプか判断し、内容を表示させたいと考えています。
一行目のヘッダーのみを読み込み、listで分解して、5番目の項目名でswitchさせれば実現できるかと思うのですが、具体的にどういうコードを書けばよいでしょうか?もっと簡便なアルゴリズムがあれば、そちらでもかまいません。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2010/03/09 13:25:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答3件)

id:anoncom No.1

回答回数16ベストアンサー獲得回数2

ポイント35pt

今回の条件だけであれば、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 タイプ

  }

id:doumoto

うーん、この例だと、帰ってくる数値は常に1のような気がするんだけど、

$line = fgetcsv($file, 1000, ",")

echo count($line);

で、カラム数というか、項目数が出ますよね。ただ、末尾のデータが空白だと、正確なカラム数が出ないです。(´ー`)y-~~。

2010/03/02 18:04:44
id:GreenStar No.2

回答回数192ベストアンサー獲得回数46

ポイント35pt

数だけで判断しても良いなら 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,郵便番号,"住所","氏名","年齢","職業","性別","備考"') {

まだまだ、いろいろありそうだから、いろいろやってみて、

システムにあったものを選んでくださいね。

id:doumoto

ん~、成る程。ヘッダーのカウントを取って、割り振ると。仮に項目の数が同じで並びが違うcsvデータを読むにしても、element[n]の比較を増やせば対応できそうですね。(´ー`)y-~~。

2010/03/02 22:16:07

質問者が未読の回答一覧

 回答者回答受取ベストアンサー回答時間
1 km1967 541 450 40 2010-03-02 13:38:20
  • id:GreenStar
    >末尾のデータが空白

    見出し行なのに、そんなことがあるんですか?!
    まだ開けてもらってないけど
      fgetcsv で count
      fgets で ベタ比較
    で回答したから私の回答じゃあ足りませんね。

    単純に "職業" の有無を探しだけで足りそうですか?
    順不同になったりとか条件増えたりしません?
    複雑になるなら条件提示してもらって正規表現になるかな?

    う~~~~ん、どうしたらいいんだ~~~~!!!!
  • id:doumoto
    while ($array = fgetcsv($file, 1000, ",")) {

    if (count($array) == $type_a){
    echo "type_a";
    }
    elseif (count($array) == $type_b){
    echo "type_b";
    }
    else {
    echo "error!";
    }
    }
    こういう書き方をすると、末尾項目にデータが未入力の場合、配列にデータが格納されずに、ヘッダーとデータのカウント数値が異なってしまうのです。(´ー`)y-~~。なので、回答していただいたみたいに、ヘッダーで条件判断した後で、ループを廻すか、末尾までデータをきっちり入力しておくか、で、正常動作しました。
  • id:GreenStar
    なるほど! 末尾ってのは多分、備考欄が空白になったりするからって事だったんですよね。了解です。正常動作したようでよかったです!
  • id:PurpleStar
    (はてなにより削除しました)

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません