csvでデータを読み込む方法はネットで見つけたのですが、下記の条件を加えた場合どうすればいいか分かりません。
ネットで見つけた方法は、ファイルを1行ごと読み込み、コンマごとに区切って配列にいれる方法です。
しかし、項目が可変の場合、名前を入れたいところに別のデータが入ったりします。
【条件】
csvの項目名は、
A,B,C,D,E,F
とする
それぞれの項目は、省略可能(どこが省略されるか分からない)
そのため、
A,D,E,F
など、項目名が少ないCSVファイルもある。
こんな場合は、どのように処理をすればよいでしょうか?
実際は、項目名が50個ほどあります。
今回の例のように、少なければ何とかできそうなのですが・・・
【補足・データファイル】
"A","B","C","D","E","F",←項目名
"山田","太郎","東京","15","123-221","男",←データ
"山田","次郎","東京","13","124-567","男",
・・・・・・・・・↓続く
・・・・・・・・・
No.4ベストアンサー
- 回答日時:
少々アクロバチックな方法かも知れませんが、ロジックを思いついたので書いてみました。
項目名が信頼できる(郵便番号/〒/ZIP/ZIP-CODEのように、同じものを指すのにバラバラの表記ではない)なら、以下のような感じでできると思います。
バラバラの表記があり得るなら、候補のリストをどこかに用意しておいて、ループで一つ一つ調べていく方法に変更すれば何とかなりそうですね。
//タイトル名からタイトルの格納番号に変換する連想配列(初期値は0 ※1)
$Titles = array("姓"=>0,"名"=>0,"郵便番号"=>0,"住所"=>0,"電話番号"=>0);
//CSVからタイトル行を読み込む
$CSVLine = split(",",CSVから読み込んだタイトル行);
//タイトル行のデータ順序を、連想配列に格納
for($i=0;$i<count($CSVLine);$i++){
$Titles[$CSVLine[$i]] = $i+1;//+1してデータを保存する(※2)
}
//確認用
if ($Titles["姓"]){
echo "姓は{$Titles["姓"]}番目に格納されています。";
}else{
echo "姓は省略されています。";
}
if ($Titles["名"]){
echo "名は{$Titles["名"]}番目に格納されています。";
}else{
echo "名は省略されています。";
}
if ($Titles["住所"]){
echo "住所は{$Titles["住所"]}番目に格納されています。";
}else{
echo "住所は省略されています。";
}
if ($Titles["電話番号"]){
echo "電話番号は{$Titles["電話番号"]}番目に格納されています。";
}else{
echo "電話番号は省略されています。";
}
//CSVからデータ行を読み込む
$CSVLine = split(",",CSVから読み込んだデータ行);
//0番目の配列を空にしておく
array_unshift($CSVLine,"Dummy");//(※3)テスト用に空文字列ではなく、文字列"Dummy"を格納
echo "氏名:".$CSVLine[$Titles["姓"]]." ".$CSVLine[$Titles["名"]];
echo "郵便番号:".$CSVLine[$Titles["郵便番号"]];
echo "住所:".$CSVLine[$Titles["住所"]];
(※1)で初期値を0にし、(※2)で格納順序を+1して、(※3)で0番目に空の要素を用意することで、その項目が省略されているか否かの判定が不要になる。
ありがとうございます。
これを参考にして、試行錯誤したいと思います。
今回の質問は、これから作ろうとしているプログラムの一部です。
これからも、もっとわからないことが出てくると思います。
そのときは、またお願いします。
No.3
- 回答日時:
>項目名が少ないCSVファイルもある。
の意味が、ファイルごとに項目数が違うのか、1ファイル内で項目数が違うのか。
できないということなので私も後者として受け取ったのだけど。
前者なら1行目の項目定義を見て振り分ければよし、
後者なら基本的に無理。データが既に構造化されていないから。
省略される項目を絞ることができて、データ自体に型なり候補なりが
推測できるのであれば力技でやれるかもしれませんけど。
この回答への補足
ありがとうございます。
>前者なら1行目の項目定義を見て振り分ければよし、
ここの部分が思いつきません。
考え付くのは、力技になりそうです。
何かスマートな方法があればと思って質問しました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- その他(プログラミング・Web制作) Pythonで、データファイルと列名ファイルを1つのファイルにしたいです。 1 2023/07/27 20:29
- Ruby pandasでsqlite3にテーブル作成・追加・読み出しでindexの取り扱い方教えてください 5 2023/03/08 09:57
- その他(プログラミング・Web制作) Windowsのバッチファイルについてご教示ください 5 2023/07/25 20:23
- Excel(エクセル) 【困っています】VBA 追加処理の記述を教えてください。 1 2022/08/25 22:54
- Visual Basic(VBA) VBAで、1つのエクセルで、2つのシートからもう1つのシートに条件のある転記コードを教えてください。 1 2023/03/16 18:07
- Visual Basic(VBA) 指定月分の顧客データファイルを統合して並べ替え、所定の場所に貼り付ける 3 2022/09/10 07:55
- その他(Microsoft Office) EXCELの1行を1枚の用紙にそれぞれ印刷したい。 3 2022/10/10 11:35
- Visual Basic(VBA) マクロを教えてください。 7 2023/06/01 19:47
- その他(Microsoft Office) VBA CSV出力について 3 2023/04/19 14:14
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Dosブロンプトでtabを出力したい
-
PHP一覧表示した項目にリンクを...
-
switch()文で値の大小比較
-
小数点以下0の非表示
-
shシェルスクリプト 空白行の...
-
PHPでのパスワード制限のセキュ...
-
batファイルでPC名称の変更
-
変数の受け渡しによる画像の表示
-
Parse error というエラーの対...
-
オブジェクト指向 継承について
-
phpでcookieがうまく保存されない
-
環境変数「%USERPROFILE%」の内...
-
PHPで訪問回数を表示するカウン...
-
オブジェクトの中身の判定(PHP)
-
バッチファイルでpingの結果を...
-
シェルスクリプトbashについて...
-
PHP 九九表
-
RSSにdiv,ul classを付けたいの...
-
コマンドプロンプト フォルダ内...
-
PHPとCSSを使用して九九...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Dosブロンプトでtabを出力したい
-
switch()文で値の大小比較
-
phpでcookieがうまく保存されない
-
バッチファイルでpingの結果を...
-
shシェルスクリプト 空白行の...
-
syntax error, unexpected 'ech...
-
findstrのerrorlevel
-
バッチファイルで、全てのウィ...
-
PHPで訪問回数を表示するカウン...
-
PHP一覧表示した項目にリンクを...
-
DBのハッシュ化したパスワード...
-
小数点以下0の非表示
-
Windowsのsetコマンドでの小数...
-
オブジェクトの中身の判定(PHP)
-
bashの関数の引数にスペースが...
-
PHPでのパスワード制限のセキュ...
-
RSSにdiv,ul classを付けたいの...
-
pdftkを使った処理をバッチファ...
-
ゼロとNULLを区別して number_f...
-
コマンドプロンプト フォルダ内...
おすすめ情報