• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:CSVの列上下で照合し、一致したら繋げて1行にする)

CSVの列上下で照合し、一致したら繋げて1行にする

このQ&Aのポイント
  • CSVデータの列上下を照合し、同じ名前を持つ行を1行に結合する方法をご教示ください。
  • 要素数が5000件になるように、CSVデータの同じ名前を持つ行を1行に結合した場合、どのようにデータが整理されるのか教えてください。
  • PHPのスクリプトを使用して、CSVデータの同じ名前を持つ行を1行に結合する方法を教えてください。

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

  • ベストアンサー
  • agunuz
  • ベストアンサー率65% (288/438)
回答No.1

file_get_contentsで読んでexplodeするくらいなら最初からfileで読んだ方がとは思いますが、そもそも「CSVデータ」をいう前提ならfgetcsv()で読むかstr_getcsv() でパースするのが妥当。で、出力も当然fputcsvで書き出すべき。 <?php $file = file('list.csv', FILE_IGNORE_NEW_LINES); $svkey = ''; $output = array(); $fp = fopen('tmp.csv', 'w'); foreach ($file as $line) { $line = mb_convert_encoding($line, 'utf-8', 'cp932'); $data = str_getcsv($line); if (count($data) < 3) { continue; } $key = $data[0]; $data = $data[2] . ':' . $data[1]; if ($key <> $svkey) { // KeyBreak if ($svkey <> '') { array_unshift($output, $svkey); fputcsv($fp, $output); } $output = array(); } $svkey = $key; $output[] = $data; } if (count($output) > 0) { array_unshift($output, $svkey); fputcsv($fp, $output); } fclose($fp); // デバッグ用表示 print nl2br(htmlspecialchars(file_get_contents('tmp.csv')));

kzkz-16
質問者

お礼

とっても参考になるスクリプトありがとうございます! 無事に希望通りのスクリプトを作る事ができました!

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

その他の回答 (2)

noname#244856
noname#244856
回答No.3

仕様を固めたほうがいい点に関してはyambejpさんに同意です。 とりあえずそれっぽいのを作ってみました。 http://ideone.com/FR3iRe

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

ちなみに >下記のようなCSVデータがあります。 例示の仕方がわるいですね。 カンマ区切りなのにスペースでインデントすると回答がブレますよ。 また文字列中にカンマがはいる可能性がどのくらいあるか? 文字列をクォーテーションでくくったりしないのか? (つまり区切り文字としてのカンマと文字列としてのカンマの競合をどうするかということ) など仕様がかたまっていないとバグだらけになりそうですよ >上下で名前フィールドが一致したら、他の列の内容と日時を全て繋げて1つのフィールドに入れる というのは「連続した行」のみ対応とも読めます。 田中→吉田→田中 のような場合でも、どんどん田中にたしこんでよいのですよね?

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

関連するQ&A

  • 上下の値が一致したら、他の列の上下を統合し1行に

    下記のようなデータがあります。 「名前」「内容」「日時」 田中  報告1  日時 田中  報告2  日時 田中  報告3  日時 吉田  報告1  日時 吉田  報告2  日時 佐々木 報告1  日時 藤森  報告1  日時 藤森  報告2  日時 豊富  報告1  日時 豊富  報告2  日時 16000件あり、同一名で重複行を消すと5000件になります。 このデータを下記の通り、同じ人物の報告は1行のデータに変換したいです。 ↓名前が同一だったら内容と日時を全て繋げて1つのフィールドに入れる 「名前」「内容」 田中  [日時:報告1、日時:報告2、日時:報告3] 吉田  [日時:報告1、日時:報告2] 佐々木 [日時:報告1] 藤森  [日時:報告1、日時:報告2] 豊富  [日時:報告1、日時:報告2] 関数を駆使して出来るのでしょうか。 マクロでしょうか。 お知恵をお貸しください。 尚、解りやすいように報告1、報告2と数字を付けていますが、 実際のデータには数字は付いていません。 何卒、宜しくお願い致します。

  • csvファイルを読み込んだ時の「ゼロ」の扱い

    すみません、教えてください。 test.csv というファイルに、 佐藤, 東京 田中, 大阪 中西, 京都 というデータが入っていたとして、以下を使って読み込むと、 <?php $file_name = "test.csv"; $fp = fopen( $file_name, 'r' ); $data = array(); while( $ret_csv = fgetcsv( $fp, 256 ) ){ for($col = 0; $col < count( $ret_csv ); $col++ ){ $data[$col][$row] = $ret_csv[$col]; } $row++; } fclose( $fp ); var_dump($data); ?> 以下のように、 [0] ではなく [""] となってしまうのですが、これを [0] にする方法はないでしょうか。 array(2) { [0]=> array(3) { [""]=> string(6) "佐藤" [1]=> string(6) "田中" [2]=> string(6) "中西" } [1]=> array(3) { [""]=> string(6) "東京" [1]=> string(6) "大阪" [2]=> string(7) "京都 " } } よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • jQueryを使ったCSVテーブル表示

    こんにちは、以下のサイトにある「csv2table-0.02-b-1.zip」を ダウンロードし、サンプルを利用してCSVデータをWEB上に表示する 機能を、自社のHPで利用しております。 http://allabout.co.jp/internet/javascript/closeup/CU20080229A/index... 上記サイトの中に「csv2table デモ v0.02(2008.3.1リリース) 」 の項目があり、以下2点のサンプルがあります。 ・setting.select 列の選択 ・setting.where 行の絞込み 質問ですが、例えば3列目が"田中"の項目(行)だけ抽出し、それプラス 3列目自体を表示させないような処理を作りたいのですが、 どのように設定すれば実現できますでしょうか? ※以下のように設定すると何も項目が表示されません…  当たり前ですが、select : [0,1,2,3,4]とすると正しく指定した  条件で抽出できます。 onclick = "$('#view54').csv2table('./data/Book12-utf8.csv',{ where : [{'名前':'==田中'}] select : [0,1,3,4] });" どなたかご存知の方がいらっしゃいましたら、アドバイス頂けると 幸いです。 よろしくお願いいたします。

  • csvの特定のキーワードを指定して、そのキーワードを含む行を表示させる方法

    こんにちは。いつも参考にさせてもらっています。 さて、下記のコードはcsvのデータをphpにて読み込み、各項目ごとに分割をして、指定した行のみをtableに表示させているのですが、実際は行を指定するのではなく、特定のキーワードを指定し、その指定したキーワードの行をtable上に表示させたいのです。 自分なりに調べてみたのですが、うまくいかない理由がわからなかったので今回投稿させて頂きました。 よろしくお願い致します。 <?php $openfile = file_get_contents('sq-tyo.csv'); $csv_gyo = split("\n", $openfile); echo "<div>"; list($from, $class, $to, $type1, $type2, $kikan) = split(",", $csv_gyo[0]);//1行目 echo "<table>"; echo "<tr>"; echo "<td>"; echo "<b>出発地</b>"; echo "</td>"; echo "<td>".$from."</td>"; echo "<td>"; echo "<b>座席クラス</b>"; echo "</td>"; echo "<td>".$class."</td>"; echo "</tr>"; echo "<tr>"; echo "<td>"; echo "<b>目的地</b>"; echo "</td>"; echo "<td>".$to."</td>"; echo "<td>"; echo "<b>種類</b>"; echo "</td>"; echo "<td>".$type1."</td>"; echo "</tr>"; echo "<tr>"; echo "<td>"; echo "<b>経路</b>"; echo "</td>"; echo "<td>".$type2."</td>"; echo "<td>"; echo "<b>期間</b>"; echo "</td>"; echo "<td>".$kikan."</td>"; echo "</tr>"; echo "</table>"; ?> 本当はデータベースを使用したいのですが、今回はcsv使用のみと言われてしまったので、ご協力をお願いいたします。

    • ベストアンサー
    • PHP
  • 【PHP】csvファイルへの書き出し(1行追加or1行上書き)について

    【PHP】csvファイルへの書き出し(1行追加or1行上書き)について はじめて利用させていただきます。 現在、PHPにて書き出し処理を作成している者ですが、csvファイルへの書き出しの際に先頭行にスペースが大量に入ってしまい、困っています。 自分なりに調べてみたのですが、原因がわかりません。詳しい方からのアドバイスをお願いしたいです。 【行っている処理】 1.csvファイルを1行ずつ読み込み、配列に格納 2.既存のデータに同じ名前の人が存在する場合は、その行の配列の内容を変更(存在しない場合は配列の末尾に1件追加) 4.現在ファイルにあるデータを削除(丸めこみ)し、配列データを書き書き出し 【ソース】(書き出し処理に問題があると思ったため、それ以外の部分は割愛させていただきます) <?php $filename = 'data.csv'; $file = fopen($filename, "r+" ); $name = array(); if(flock($file,LOCK_SH)){ while( $data = fgetcsv( $file, 1000, "," ) ) {   //配列に格納 } //配列の内容変更or新規に一行追加処理 //現在のファイル内のデータを削除(まるめこみ) ftruncate($file, 0); //1行分のデータをカンマ区切りで結合し、書き出し for($i = 0; $i < $count; $i++){ $ins = $name[$i]; $ins .= ','; $ins .= $number[$i]; //書き込み失敗時のエラー if(fwrite($file, "$ins\n" ) === FALSE){ print("ファイル書き込みに失敗しました"); }else{ //処理なし } } //ファイルロック解除 flock($file, LOCK_UN); }else{ print("ファイルロックに失敗しました"); } 【csvファイルの中身(処理実行前)】 佐藤,1234 田中,12345 中村,9876 【csvファイルの中身(処理実行後)】                       佐藤,1234 田中,12345 中村,9876 以上です。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • 二つのCSVを共通のカラムで照合して1つのファイルに

    お世話になります。 今回の質問は、分かりやすく言うと シェアウェアの「ズバリ自動化」の 結合機能のみを再現するエクセル用マクロを知りたい、ということです。 http://shop.vector.co.jp/service/catalogue/sr049619/ (上記ソフトは持っていません) 質問を図示してみます。 データ量は少ないのですが、 毎日の作業なので、一発でできれば最高です。 まず二つのCSVがあります。 注文データ(A)と発送データ(B)です。 (*は任意のデータです。) CSV(A)   A B C  D    E F G H I 1 * * * 佐藤A作 * * * * * 2 * * * 鈴木B三 * * * * * ・・・・・・・ 数行続きます。 CSV(B)   A B  C    1 * * 佐藤A作 2 * * 鈴木B三  ・・・ 氏名を照合カラムとして、それ以外のデータを結合して、 (注:CSV(B)の氏名を除いた後ろにCSV(A)を追加する) 別ファイルとして、出力するにはどういうマクロを使うのか? ということです。 二つのCSVでは名前の出てくる順序が違う場合があります。 また、 CSV(B)には(A)にない氏名も入っているので、 その場合、(B)のデータのみ引き継ぐようにするのも条件です。 よろしくお願いいたします。

  • 1行目と2行目の間にデータを書き出すには・・・。

    私はプログラマではないのですが、会社でPHPプログラムの修正を頼まれてしまいました。 ■現在のプログラム ----------------------------------- $fp = fopen( $CSVFileName, "a+" ); $a = fseek($fp,0,SEEK_END); $ret = fputs( $fp, $CSV_SJIS); fclose($fp); ----------------------------------- 現在は、以上のような方法で新しいデータを追加しているのですが、これをデータファイルの2行目に追加するように変更して欲しいと言われています。 なぜ、そのような要求が出たかというと、データファイルというのがCSV形式のファイルで、1行目にはExcelで処理するための列名(項目名)が入っています。よって2行目に新しいデータを追加したいのです。 どなたか詳しい方がいらっしゃいましたら、回答をお願い致します。

    • ベストアンサー
    • PHP
  • csvに中身が書き込まれない

    作成してみたものがうまく動かず、どこがおかしいのかよく分からないため、 質問させていただきます。 もともとtest.csvにはUTF-8で作成した中身があります。 ひとつ前の画面でPOST送信しているフォームがあり、 中身のデータは下記です。 <form action="kakikomi.php" method="post"> <input type="hidden" name="aaa" value="bbb,ccc,ddd"> </form> #kakikomi.php(UTF-8) $csvFileName="test.csv";$csv=array(); foreach($_POST as $val){$csv[]=explode(",",$val);} setlocale(LC_ALL,"ja_JP.UTF-8"); if( $pointer=fopen($csvFileName,"w")): foreach($csv as $line){fputcsv($pointer,$line);} fclose($pointer); //print_r($csv); else:die('メッセージ'); endif; この結果はcsvの中身は真っ白になってしまいます。 fputcsvのマニュアル例からそのまま引用したのですがどこかおかしいのでしょうか。

    • 締切済み
    • PHP
  • 【Excel】同じ行で2つの各値が一致する行の参照

    エクセルで【Sheet1】のデータから 【Sheet2】【Sheet3】の表を作成したいのですが、 いろいろ試してもわかりません。 どうか教えてください。 【Sheet1】 A B C   D E 1 2001 佐賀県 1 山田 090-000-0000 2 2001 愛媛県 2 佐藤 090-111-1111 3 2001 静岡県 4 伊藤 090-222-2222 4 2001 岡山県 5 中野 090-333-3333 5 2002 三重県 1 近藤 090-444-4444 6 2002 福島県 2 田中 090-555-5555 7 2002 岐阜県 3 吉田 090-666-6666 以下600行ほど続きます。 【Sheet2】 A B C 1 2001←入力します 2 1 山田 090-000-0000 3 2 佐藤 090-111-1111 4 4 伊藤 090-222-2222 5 5 中野 090-333-3333 【Sheet3】 A B C 1 2002←入力します 2 1 近藤 090-444-4444 3 2 田中 090-555-5555 4 3 吉田 090-666-6666 【Sheet2】【Sheet3】のA1には、 【Sheet1】のA1の値を入力します。 A2,B2,C2 A3,B3,C3 ... それぞれのセルにどんな数式を入れたら 表ができあがりますででしょうか? 【Sheet2】【Sheet3】共に、VLOOKUPで =VLOOKUP(A1,Sheet1!A1:D7,3,) =VLOOKUP(A1,Sheet1!A1:D7,4,)を使うと、 2行目はうまくいきますが、 3行目から狂ってきます。 頭が沸騰してきました! わかる方に教えていただいたほうが早いですネ、 どうぞご享受よろしくお願いいたします。

  • pythonで日本語csvからデータを読み込みたい

    python初心者です。 mac上で、csvファイルからデータを読み込んでデータベースを作りたいのですが… csvの中身は、例えば ID, 名字,名前, 年齢, 出身地 1, 山田, 太郎, 30, 大阪 2, 田中, 和夫, 55, 千葉 ... のような、極めてシンプルな感じです。 色々調べて、エンコードの問題があることは理解しましたが、web上の解決策を試してもなぜかうまく行きません。(python2.7です。) #coding:utf-8 import csv inputfile = open(u'data.csv', 'rU') reader = csv.DictReader(inputfile) for r in reader: print r とすると、1行ずつ読み込めてはいますが、printしたときの日本語が読めません。 どうすれば良いのでしょうか? また、読めないですが、プログラム内でデータのやり取りをする分には問題ないのでしょうか? (例えば、1番とX番の出身地が同じ、の判定をするとか) 非常に基本的な問題だと思うのですが、sqlでデータベースを作る前のこの段階で躓いて、全然前に進めずにいます(>_<) どうか教えて下さい、宜しくお願いします。