• ベストアンサー

複数のデータを選択し結果をcsvに保存し処理

現在複数のデータを選び、その結果をcsvで保存することを考えています。 例えば 好きな国を選んで、コメントを書いてください。 アメリカ イギリス フランス スペイン ポルトガル ブルガリア ・ ・ ・ と100ヶ国表示します。チェックボックスで好きな国を任意の数だけ選びそれをcsvに保存したと仮定します。 data.csv ============= ユーザー名,好きな国,コメント ユーザA,アメリカ,イギリス,スペイン,行きました。 ユーザB,アメリカ,ブルガリア,イギリス,ポルトガル,好きです。 ユーザC,イギリス,コメントです。 ========================= これを読み出す場合、列が沢山あるため $Data = file("data.csv"); for($i=0;$i<sizeof($Data);$i++){ $line = explode(",",$Data[$i]); =====ここの処理がわかりません。=== list($u_name, $kuni, $kuni, $kuni, $kuni, $kuni, $kuni, ・・・・・・・$com = $line; if($u_name = $_GET['u_name']) echo "$u_nameの好きな国リスト<P>"; echo " $kuni<BR>"; } } とlistで変数に配分することができません。 このようなユーザーが何件登録するかわからない場合のCSVの処理はどのようにすればよろしいのでしょうか? ユーザーの名前を利用してu_name.txtを作成し中にデータを書き込んだほうが良いのでしょうか? このような複数選択されて何件登録されるかわからない(フィールドが何列になるかわからない)データの保存、処理はどのように行うのが定石なのでしょうか? 恐縮ですがお力をお貸し頂ければ幸いです。

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

>とlistで変数に配分することができません。 $line[index]と別の変数に配分しなくても、そのまま配列で扱えばいいと思います。 >(フィールドが何列になるかわからない)データの保存 データベースなんかの場合は 名前, 国, コメント のようなレコードを国の数だけ登録するというような感じになると思います。 そういう使い方でないなら、まとめてそのまま保存しておいて、取り出した時にやはりexplode で分割するというような形になるのじゃないかと思います。

yun100
質問者

補足

お忙しい中、ご返信を下さり本当にありがとうございます。 私自身の知識不足から恐縮ではありますが質問させていただきます。 >$line[index]と別の変数に配分しなくても、そのまま配列で扱えばいいと思います。 この場合はCSVを書き換えて ============= ユーザー名,コメント,好きな国 ユーザA,行きました。,アメリカ,イギリス,スペイン ユーザB,好きです。,アメリカ,ブルガリア,イギリス,ポルトガル ユーザC,コメントです。,イギリス ========================= <?PHP $Data = file("data.csv"); for($i=0;$i<sizeof($Data);$i++){ $line = explode(",",$Data[$i]); if($line[0] == "ユーザC"){ $count = count($line); echo "$line[0]の好きな国リスト<P>"; for($i=2;$i<$count;$i++){ echo " 好きな国:$line[$i]<BR>"; } echo "コメント:$line[1]"; } } ?> とすることで、確かにやりたいことは出来たのですが 少し腑に落ちない所というかよく理解できない考え方があります。 まず、CSVを書き換えなければいけない事 (これはプログラムの仕様と考えれば仕方のないことなのかもしれません。) そして、アンケートのような場合 質問1.好きな果物を何個でも書いてください。 質問2.好きな飲み物を自由に書いてください。 といった場合、上記のプログラムでは 実現できない事 >データベースなんかの場合は >名前, 国, コメント >のようなレコードを国の数だけ登録するというような感じになると思います。 ようやくMysqlをちょっと理解できるようになった程度でこのような質問は 本当に恐縮ですが >レコードを国の数だけ登録するというような感じ ということは上記のようなCSVをMYSQLで実現させる場合 テーブルを2つ作って 1つ目にはユーザー名とコメントを 2つ目にはそのユーザー名のテーブルを用意して そこにレコード(行)として登録するイメージでよろしいのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

#1>CSVを書き換えなければいけない事 #1>$count = count($line); の様にして、いくつのデータがあるのか調べていますよね。 だったら、並び替えなくても、 最初のデータが名前で、最後のデータがコメントだとわかると思います。 #1>1つ目にはユーザー名とコメントを #1>2つ目にはそのユーザー名(と国)のテーブルを用意して #1>そこにレコード(行)として登録するイメージでよろしいのでしょうか? それでいいと思います。

yun100
質問者

お礼

>$count = count($line);の様にして、いくつのデータがあるのか調べていますよね。 >だったら、並び替えなくても、最初のデータが名前で、最後のデータがコメントだとわかると思います。 恥ずかしながらBLUEPIXY様のご指摘でようやく気づきました。確かに配列の数を数えているのだからその取得した数が配列の最後のindexになるわけですね。 sqlのご指摘も大変参考になりました。 長々とご質問にお付き合いいただき本当にありがとうございます。 そして本当にお手数をおかけしました。

全文を見る
すると、全ての回答が全文表示されます。
  • tany180sx
  • ベストアンサー率63% (239/379)
回答No.2

data.csv ============= "ユーザー名","好きな国","コメント" "ユーザA","アメリカ,イギリス,スペイン","行きました。" "ユーザB","アメリカ,ブルガリア,イギリス,ポルトガル","好きです。" "ユーザC","イギリス","コメントです。" =========================

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • phpでcsvの処理で困ってます。

    abc.csvというcsvデータを2次元配列にして、その中から指定した行(送信されてきた値$linenum = $_POST['num'];)の5番目の値を1つ増やして、またcsvデータに上書きしたいと思い下記のようにしてみたのですが、うまくいきません。どのようにすればいいのでしょうか、具体的に教えていただければ、ありがたいです。よろしくお願いします。 <?php header("Content-Type: text/html; charset=UTF-8"); $linenum = $_POST['num']; $list = fopen("abc.csv", "w"); $h = 0; while ($array = fgetcsv($list, 1000,",")) {   for ($i = 0; $i < count($array); $i++){   $newarray[$h][$i] = $array[$i]; } $h++;  } $cu = $newarray[$linenum][4]; $cu = $cu + 1; $newarray[$linenum][4] = $cu; fputcsv($list, $newarray); fclose($list); ?>

    • ベストアンサー
    • PHP
  • フォームデータのcsv保存について

    お世話になります。フォームに入力されたデータを csvファイルに保存するというcgiの作成をしています。 初めてcgiを作成するので、書籍の真似をして作成した のですが、おかしいデータが保存されてしまいます。 質問の項目数は5個で以下のとおりです <FORM ACTION="./ans1.cgi" METHOD="POST"> 名前:<br> <input type="text" name="name" size=30> <br> 1:<br> <input type="text" name="a1" size=30> <br> 2:<br> <input type="text" name="a2" size=30> <br> 3:<br> <input type="text" name="a3" size=30> <br> 4:<br> <input type="text" name="a4" size=30> <br> <INPUT type="submit" value="送 信"> <INPUT type="reset" value="リセット"> <BR> </FORM> cgiの中身です。 #! /usr/bin/perl require './cgi-lib.pl'; $answer = 5; $ansfile = "kotae.csv"; &ReadParse(*in); $name = $in{'name'}; for($n = 1; $n <= $answer; $n++ ) { $a[$n] = $in{"a$n"}; } open (FILE,">>$ansfile"); flock (FILE,2); print (FILE "\"", $name); for($i = 1; $i <= $answer; $i++ ) { $a[$i] = ~ s/\"/""/g; print FILE "\"\,\""; print FILE $a[$i]; } print FILE "\"\n"; flock(FILE,8); close(FILE); print "Content-type: text/plain\n\n"; print "<HTML><BODY>\n"; print "tesuto"; print "</body></HTML>"; exit; csvファイルの中身を見ると、最初の列には、項目1で 記入したデータが入ってますが、項目2以降 は4294967295と数字が入ってます。どうも1個目の回答 欄のデータはちゃんと取得されてるのですがそれ以降の が取得されていないみたいです。 よろしくお願いいたします。

    • ベストアンサー
    • CGI
  • VBA csvファイルのデータをリストビューへ

    こんばんは、いつもお世話になっております。 素人ですが、宜しくお願いいたします。 タイトル通りなのですが、csvファイルにあるデータをリストビューで表示したいと思っています。 リストボックスなどへの方法は検索するとヒットするのですが、 リストビューの方法はあまりないのか、見つかりませんでした。 test.csv 1,Name,Tel,Address,Address2 2,Name,Tel,Address,Address2 上記のようなデータが10行ほどあります。 何か参考になるサイトなどでも結構ですので、 ご教授願います。宜しくお願いいたします。

  • CSVファイルを更新する処理

    CSVに追加や削除、一覧表示、更新をする処理を書いたのですが 更新処理だけうまくいかずに躓いています。 readメソッドのreturn $files;のところで下記の syntax error, unexpected '$files' (T_VARIABLE)というエラーが出てしまいます。 なぜエラーが出ているか教えていただけるとありがたいです。 <?PHP function con($hantei, $num, $name, $age, $address){ $data = [ $num, $name, $age, $address ]; $datas = [$data]; // 追加 if($hantei === 'add'){ $fp = fopen('data.csv', 'a'); foreach($datas as $data) { $line = implode(',' , $data); fwrite($fp, $line . "\n"); } fclose($fp); //更新 } elseif ($hantei === 'update') { function read() { $FILENAME = 'data.csv'; $file = fopen($FILENAME, 'r'); while($data = fgetcsv($file)) { $files[] = $data; }   fclose($file);   return $files; } function replace($num, $name, $age, $address) { // read() $files = read(); $arr = array(); foreach($files as $key => $el) { // [0][a, b, c, d] // [1][a, b, c, d] if ($el[0] == $num) { // $arr[0][0] = $num ... $arr[$key] = array($num, $name, $age, $address); } else { $arr[$key] = array($el[0], $el[1], $el[2], $el[3]); } }    return $arr; } replace(); function write($arr){   $FILENAME = 'data.csv'; $file = fopen($FILENAME, 'w');   foreach ($arr as $v) {    fputcsv($file,$v); }    fclose($file); } $arr = replace($num, $name, $age, $address); write($arr); //削除 } elseif ($hantei === 'dalete') { $file = file('data.csv'); unset($file[$num]); file_put_contents('data.csv', $file); //一覧表示 } elseif ($hantei === 'list') { $fp = fopen('data.csv', 'r'); $readed = fread($fp, filesize('data.csv')); print_r($readed); fclose($fp); } } con('update', 1, 'name', 3, 'address');

    • 締切済み
    • PHP
  • CSVデータの行数カウント

    PHP初心者です。 アドバイスよろしくお願いします。 CSVデータ 20060802:1,AAA,少し 20060802:2,AAA,少し 20060802:3,AAA,少し 20060802:4,BBB,大きい 20060802:5,AAA,小さい 20060802:6,AAA,小さい 20060802:7,AAA,小さい があるとき、 そのCSVデータを読み込んで データの3列目を基準としてデータがいくつあるかを数えたい。 例えば 少し・・・・3 大きい・・・・1 小さい・・・・1 というふうに数えたい。 $filename = CSVデータファイル; $fp = fopen("$filename", "r"); if($fp == false){ exit; } else { for$i = 0; $i < sizeof($fp); $i++){ $line = explode(",", $fp[$i]); // ここで // $i[2]==AAA // のとき、AAAの行数をカウントする処理をしたい。 } }

    • ベストアンサー
    • PHP
  • サブフォームでフィルタしたデータのCSV出力

    ACCESS2007 で テーブル  T_リスト name      cate aaa       123 sss       543 rtyy      45t4 フォーム 顧客があり リスト作成ボタンがあります フォーム顧客の中に フォーム電話帳サブフォームがあり データソースはT_リストです その都度手動でフィルタをかける作業をします リスト作成ボタンを押すとフィルタで抽出したデータだけを CSVに書き出したいと思っています。 下記実行しましたが、 T_リストの一行目のデータしか書き出しません DoCmd.OpenForm ("電話帳サブフォーム")でフォームを出さずに実行したいです どなたかよいアドバイスをお願いします。 Private Sub コマンド1_Click() Dim F As Variant Dim Field1 As String Dim Field2 As String Dim M As Double Dim i As Double Field1 = "name" Field2 = "cat1" M = Me![電話帳サブフォーム].Form.Recordset.RecordCount Open "C:\ListMaker\out.csv" For Output As #1 Write #1, Field1, Field2 DoCmd.OpenForm ("電話帳サブフォーム") Me.[電話帳サブフォーム].SetFocus For i = 1 To M DoCmd.GoToRecord acDataForm, "Me.電話帳サブフォーム", acGoTo, i Write #1, Me![電話帳サブフォーム]![name] i = i + 1 Next DoCmd.GoToRecord , , acFirst Close #1 End Sub

  • phpメールフォームから送信・登録されたデータをcsvで保存する方法

    質問があります。よろしくお願いします。 タイトルの通りにPHPのメールフォームから送信・登録されたデータを メール送信とは別に、ログ一覧のようにcsvファイルに保存したいのです。 似たような質問を探しまして、こちらの質問とほぼ同じ質問でして URL:http://okwave.jp/qa3279798.html こちらの質問主様が引用しているフォームメールは利用していたので、 URL:http://php.eweb-design.com/1301_mail.html? 回答にあるソースを同じように利用してみようと思ったのですが、 挿入場所が分からず上手く利用できません。 php4でANo.4の回答者様が明記したソース(最後に明記)を 上記のメールフォームで利用する場合はどこに挿入すればいいのでしょうか。 それともこのフォーム用に何か書き足したりしないとならないのでしょうか。 (email、nameなどの送信項目名部分は自分用に合わせて書き換えて試しました) 分かる方いましたら、ご回答のほうよろしくお願いします。 ↓↓明記してあったソース↓↓  $DATA1 = array("メールアドレス","名前","アンケート");//1行目を格納   $DATA2 = array($email,$name,$Anke_to);//2行目を格納   $WriteList = array($DATA1,$DATA2);//2次元配列にする   $res_file = fopen("Sample.csv",'w+');   foreach($WriteList as $list){     for ($i =0 ;$i < 3;$i++){       if($i==2){//アンケート項目か         fwrite($res_file, $list[$i]);       }else{         fwrite($res_file, $list[$i].",");       }     }     fwrite($res_file, "\r\n");//改行を挿入   }   fclose($res_file);

    • ベストアンサー
    • PHP
  • CSVデータ読込だら・・・1文字目のみ文字化け

    PHP4.xxでSQLIte3で行っています。 名簿をCSVデータで一気にDBにインサートしたいのですが・・・ なぜか名前の1~2文字目あたりのみ文字化けします。 色々試行錯誤していますが・・・ 糸口が見つからなくて・・・ どなかたかご教授して頂けませんか?! 文字化け具合(というよりアルファベットに変わってる)が画像を参照してください。 CSVデータでは、山崎まさよし、abc、岡田てるお となっています。 ちなみにコードはこのような形です。 -------------------------------------------------------- $updir = "./csv/"; $save_name = "list.csv"; if (is_uploaded_file($_FILES["csv"]["tmp_name"])) { if (move_uploaded_file($_FILES["csv"]["tmp_name"], $updir.$save_name)) { chmod($updir.$save_name, 0644); echo "<br />CSVファイルをアップロードしました。"; // CSVの各内容をインサート $row = 1; $handle = fopen($updir.$save_name, "r"); while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { $num = count($data); $insert = "insert into list values ("; $insert_row = ""; $row++; for ($c=0; $c < $num; $c++) { $data[$c] = mb_convert_encoding($data[$c], "EUC-JP", "SJIS"); $insert_row .= "'".$data[$c]. "',\n"; } $insert_query = $insert.$insert_row; $insert_query = substr($insert_query, 0, (strlen($insert_query)-2) ); $insert_query .= ")"; if(sqlite_query($insert_query, $conn)){ } else { echo "<br>配信先情報の追加を失敗しました。"; } } } } fclose($handle); --------------------------------------------------------

    • ベストアンサー
    • PHP
  • 複数テーブルからのデータ参照

    mysqlを使用してCGIを作成しています。 下のような3つのテーブルがあると想定します。 ユーザマスタ +------+-------+ |U_ID  |U_NAME| +------+-------+ |1    |hoshino| +------+-------+ |2    |irabu | +------+-------+ |3    |imaoka | +------+-------+ 商品予約テーブル +-------+--------------+ |Y_ID  |U_ID(予約者) | +-------+--------------+ |101  |1       | +-------+--------------+ |102  |3       | +-------+--------------+ 出庫テーブル(予約テーブルのデータを元に出庫を行う) +-------+-------------------+-------+ |S_ID  |U_ID(出庫者) |Y_ID | +-------+-------------------+-------+ |201  |1          |102  | +-------+-------------------+-------+ |202  |2          |101  | +-------+-------------------+-------+ この3つのテーブルから以下のようなデータを 1回の問い合わせで取得できますでしょうか? +-------+--------------+-------+--------------+ |S_ID  |U_NAME(出庫者)|Y_ID |U_NAME(予約者) | +-------+--------------+-------+--------------+ |201  |hoshino    |102  |imaoka     | +-------+--------------+-------+--------------+ |202  |irabu     |101  |hoshino    | +-------+--------------+-------+--------------+ 商品予約テーブルと出庫テーブルがそれぞれ持つU_IDで それぞれ別のユーザ名を取得することができるかどうかが どうしてもわからなくて困っています。。。 どなたか方法をご存知でしたら教えてください。 よろしくお願いします。m(__)m テーブルの書き方が見にくくてすみません。。。

  • テキストデータを複数の変換条件に従って高速処理

    CSVファイルがあり、そこにはクレジットカード利用データが記録されています。 日付、店名、金額、処理番号とでもさせてください。 店名に従って、カテゴリを書き込んでいきます。マクドナルドなら食事とかヒルトンなら宿泊費などです。マクドナルドだけでも店場所がちがうとそれらもまとめなければなりません。このあたりは正規表現で置換させます。 どこから店名のリストと対応するカテゴリのリストを用意して条件を作成するのか、という問題がありますが(最初は手打ち)とりあえずどうやってスクリプトを書いていけばよいのか指針を教えてください。何百という対応リストに何十というデータ行があります。一行づつ読んでいき、店名リストに一つずつ照らし合わせていくのではかなり遅くなるのではないでしょうか。 こういったときにはどういうロジックを使用するのでしょう?2次元配列とか聞いたことがあります。カード利用回数だけループさせて何百という条件処理を一度にくぐらせる、もしくは履歴データを丸ごと条件処理数だけくぐらせれば時間短縮になりますよね。うまく伝わってくれればよいのですが。 エクセルマクロにするのかパイソンで書くのかも考えなければなりません。(他は経験まったく無し) どうぞよろしくお願いいたします。