• ベストアンサー

phpで、可変項目のcsvデータを読み込みたい

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","男", ・・・・・・・・・↓続く ・・・・・・・・・

  • PHP
  • 回答数4
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
  • BellBell
  • ベストアンサー率54% (327/598)
回答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番目に空の要素を用意することで、その項目が省略されているか否かの判定が不要になる。

a-z_A-Z
質問者

お礼

ありがとうございます。 これを参考にして、試行錯誤したいと思います。 今回の質問は、これから作ろうとしているプログラムの一部です。 これからも、もっとわからないことが出てくると思います。 そのときは、またお願いします。

その他の回答 (3)

  • tany180sx
  • ベストアンサー率63% (239/379)
回答No.3

>項目名が少ないCSVファイルもある。 の意味が、ファイルごとに項目数が違うのか、1ファイル内で項目数が違うのか。 できないということなので私も後者として受け取ったのだけど。 前者なら1行目の項目定義を見て振り分ければよし、 後者なら基本的に無理。データが既に構造化されていないから。 省略される項目を絞ることができて、データ自体に型なり候補なりが 推測できるのであれば力技でやれるかもしれませんけど。

a-z_A-Z
質問者

補足

ありがとうございます。 >前者なら1行目の項目定義を見て振り分ければよし、 ここの部分が思いつきません。 考え付くのは、力技になりそうです。 何かスマートな方法があればと思って質問しました。

  • singlecat
  • ベストアンサー率33% (139/418)
回答No.2

取り敢えず、1行目の項目名を見て、実際の項目番号を判定すれば 大丈夫なのでは?

a-z_A-Z
質問者

お礼

ありがとうございます。 >1行目の項目名を見て、実際の項目番号を判定すれば大丈夫なのでは? どうすればいいのでしょうか? どうしても、力技のようなことしか思いつきません。

回答No.1

無理だと思う。 苗字 名前 都道府県 とあったときに 山田 東京 は 「山田 東京」という姓名の人なのか 山田という姓の人が東京に住んでいるのか, 山田という名の人が東京に住んでいるのか, プログラムからは区別できないから。

a-z_A-Z
質問者

お礼

ありがとうございます。 一行目の項目で判断して、データを振り分けたいと考えています。 実際に、そのようなシステムがあり、どうやっているのか疑問に思ったので質問しました。

関連するQ&A

  • 複数のcsvファイルをマクロ(VBA)で取り込みたい

    複数のcsvファイルをマクロ(VBA)で取り込みたい csvファイルの中身が、 20090507 120508 osaka 項目1,項目2,項目3,・・・・・,項目10 a1,a2,a3,・・・・・,a10 b1,b2,b3,・・・・・,b10 c1,c2,c3,・・・・・,c10 や 20090507 132529 hokkaido 項目1,項目2,項目3,・・・・・,項目10 d1,d2,d3,・・・・・,d10 e1,e2,e3,・・・・・,e10 f1,f2,f3,・・・・・,f10 となっているcsvファイルが特定のフォルダの中に100以上あります。 このcsvふぁいるの5行目だけをaccessに書き込んでテーブルに追加していきたいと思っています。 項目1,項目2,項目3,・・・・・,項目10 a1,a2,a3,・・・・・,a10 d1,d2,d3,・・・・・,d10 このようなテーブルができればいいのですが・・・ csvファイルを開く→5行目をテーブルに追加→csvファイルを閉じる(削除する)→次のcsvファイルを開く→5行目をテーブルに追加→csvファイルを閉じる(削除する) この流れでいいと思うのですが方法が分かりません。 丸投げですがよろしくお願いします。

  • 複数のCSVファイルからのデータ取得(VBA)

    エクセルVBAで、エクセルの指定シートに複数のCSVファイルからデータを取得する方法を ご教授お願います。 エクセルの指定シートの指定されたセルに、複数のCSVファイルから指定箇所のデータを 取得し転送する方法を考えていますが、どうもうまくいきません。 たとえば、 CSVファイル(1) A5(A)           A10(B) CSVファイル(2) A5(C)           A10(D)      CSVファイル(3) A5(E)           A10(F)         ・      ・      ・ と、指定されたセルからデータを取得し、 エクセルの指定シートの表に                    CSVファイル                                 (1)  (2)  (3) ・ ・ ・ ------------------------------------------- A5から取得したデータ    A   C   E ・ ・ ・ A10から取得したデータ    B   D   F ・ ・ ・ ------------------------------------------- と、いうように転送して貼り付けていきたいです。 いろいろ調べてみたのですが、このような方法が見つけられませんでした。 ぜひ、皆様のお知恵をお貸しください。 宜しくお願い致します。

  • 項目毎に新規CSV形式、ファイル名をつけて保存

    お世話になります。 エクレルの項目毎に新規CSVファイルで、ファイル名をつけて保存したいです。 (1)添付図のようなフォーマットを、D列+CSVで保存を行う。 ・山本株式会社.csv ・佐藤有限会社.csv ・株式会社鈴木.csv ・有限会社田中.csv (2)新規ファイル内容 A列:支店番号(元データのE列) B列:支店名(元データのF列) C列:売上(元データのG列) マクロを使って上記作業は可能でしょうか? どうぞよろしくお願いいたします。

  • CSVデータの項目名からファイル名を付ける

    CSVデータからHTML拡張子で書きだすCGIを作成してます。 参考になるサブルーチンをネットで見つけたのですが、行の上から順に001.html・・・・のファイル名になり、CSVデータの項目にあるデータでファイル名を付けたいと思いますが、どのように処理したらよいかわかりません。アドバイス願います。 -------------------------------------------------------------- サンプルのCSVデータ(2行目のファイル名をファイル名につけたいです。) タイトル,ファイル名,会社名,担当者,URL 山ちゃん,yamadaya,山田屋,山田,http://www.oooxxx.oo 最上ちゃん,mogami,最上商店,最上,http://www.oooxxx.oo 南ちゃん,minami,南喫茶,南,http://www.oooxxx.oo -------------------------------------------------------------- コード: $list = join('',@csv); @list = split(/\n/, $list); for($count=1;$count<@list;$count++){ $html = $template; $filename = sprintf("%03d.html",$count); @listinfo = split(/\,/,$list[$count]); for($cnt=0;$cnt<@listinfo;$cnt++){ $no = sprintf("<!--%02d-->",$cnt); $html =~ s/$no/$listinfo[${cnt}]/g; } flock(FH, LOCK_EX); open(FH,">$filename"); print FH $html; close(FH); flock(FH, LOCK_NB); }

  • htmlでcsvデータを扱いたい

    簡単に申し上げますと、2つに分かれたフレームにA.htmlとB.htmlを表示させているのですが、Aで読み込んだcsvデータをBで参照できるか、ということなんですが、どうでしょうか。(現状ではAは固定でBのフレームがC,D,E.htmlと色々変わるのでその都度csvを読み込んでいます。とても重たく表示が遅いので、Aで読み込んだcsvをBで参照できればいいなと。ちなみにcsvデータをファイル毎に分けるのは不可です。) 宜しく御願いいたします。

  • VBスクリプトでcsvファイルを比較

    別々のCSVファイルがありますが同じ形式にしておいて、 a.csv a,b,c b.csv d,e,f aとd、bとe、cとfと順番に比較する方法を教えて頂けますでしょうか。

  • CSVファイルからn個目の項目を取得する方法

    タイトルの通りCSVファイルからn個目の項目を取得する方法を教えていただきたいです。 例 1レコードあたり100項目あるCSVファイルから1個目、10個目、13個目の項目を取得する。 1レコードあたり項目数が少なければ下記コマンドでいけると思うのですが項目が多いと非常に遅くなってしまいます。 (やり方が悪いだけかもしれません) sed -e 's/¥(.*¥),¥(.*¥),•••••/¥1,¥10,¥13/' ファイル名 よろしくお願いします。

  • エクセルでcsvデータを自動読み込みする方法(至急)

    csv形式のファイル(内容は計測値データ)をエクセルに読み込み、csvファイルの各データが規定値内に納まっているかの確認が容易できる方法を探しています。 このとき条件として、 (1)csvファイル内のデータは10項目程度。 (2)csvデータはランダムに更新される。 (3)エクセルに読み込むときはエクセルシート内の決められたセルにそれぞれデータが格納されること。 (例)csvファイルに"110"と"119"の2種類のデータがあった場合、あらかじめxlsファイルのセルA1に「警察」、セルA2に「消防署」と記入しておき、csvファイルのデータを読み込んだとき、セルB1に"110"、セルB2に"119"と入力される。 (4)csvファイル自体は開かず、必要なときにあらかじめ作成したxlsファイルを立ち上げると、自動でcsvファイルの内容を吸い上げる。 (5)入力されたデータの適否をそれぞれ判定する。 (6)xlsファイルを立ち上げている間にcsvファイルが更新された場合、xlsファイルの更新方法は手動と自動を選択できる。 こんなこと出来るでしょうか? 特に(4)が困っています。csvファイルをエクセルで開いた状態であれば、この内容で出来たのですが・・・。 どなたか良い方法があったら教えて下さい。お願いします。

  • バッチでCSVを処理する時、空の項目があった場合

     例えば、以下のような二行からなるCSVファイルが有ります。 TK,001,A,DC, ,5,12 TK,002,B,DC,13,6,13   バッチで、このファイルを読み込んで、以下のようなレイアウトでCSVファイルを出力したいです。 TK,A, ,12 TK,B,13,13  しかし、一行目のデータに空の項目が発生していますので、 for /f "delims=, tokens=1-7" %%I in (sample.csv) do ( … )  で処理した場合、自動に、空の項目を飛ばし、次の項目を読み込みますので、出力ファイルは以下のようになってしまいます: TK,A,5 ,12 TK,B,13,13    こういうことを避けたいですが、なかなかいい方法が見つかりません。解決方法をご存知の方、教えていただけませんか?

  • SQL*LoaderでCSVから指定した列のみインポートしたい。

    SQL*Loaderを用いてOracleのテーブルにデータを格納 しようと思っています。 格納するデータはカンマ区切りのCSVファイルです。 入力CSVファイルは他テーブル用のファイルなので、 ローダーで落とし込むテーブルとは列数が異なります。 ですので、「CSVの5列目の値をテーブルのAA_NOというフィールドに 格納する。ということが可能なのでしょうか?」 CSVファイルのある行が a,b,c,d,e,f というデータの場合、テーブルには a,e,f とインポートしたいのです。 よろしくお願いします。

専門家に質問してみよう