人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

●質問者: どうもと
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:Aタイプ Bタイプ CSV PHP switch
○ 状態 :終了
└ 回答数 : 2/3件

▽最新の回答へ

1 ● あのん
●35ポイント

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

}

◎質問者からの返答

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

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

echo count($line);

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


2 ● GreenStar
●35ポイント

数だけで判断しても良いなら 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-~~。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ