質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

3837閲覧

PHP csvとcsvの比較 → 書き換え

kazoogon

総合スコア281

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2018/09/27 21:29

実現したいこと(PHP)

//カテゴリー情報のcsv(cat.csv) 1,1,野球 1,2,テニス 10,,野球 11,,バドミントン 1,3,アイスホッケー

このcat.csvを元にproduct.csvの情報を変更する

//プロダクト情報のcsv(product.csv) category1,category2,product_id,name //category2は削除 1,1,100,ボール //1,1はcat.csvによると1,1の組み合わせは「野球」なので1,2列目を結合し「野球」に変更 1,2,101,ラケット 10,,102,グローブ 11,,103,ネット 1,3,104,マスク ↓ (変更後) category1,product_id,name 野球,100,ボール テニス,101,ラケット 野球,102,グローブ バドミントン,103,ネット アイスホッケー,104,マスク

にしたいと思っております.

現状

$file = "./product.csv"; $product_csv = get_csv_data($file); $file = "./cat.csv"; $cat_csv = get_csv_data($file); //product.csvのカテゴリナンバー1,2を抽出し配列に格納 $product_target=array(); foreach($product_csv as $row) { $_row=array(); for($_i=0;$_i<count($row);$_i++) { if($_i==0 || $_i==1) { $_row[]=$row[$_i]; } } $product_target[] = $_row; } //cat.csvのカテゴリナンバーとカテゴリ名を配列に格納 $cat_target=array(); foreach($cat_csv as $row) { $_row=array(); for($_i=0;$_i<count($row);$_i++) { $_row[]=$row[$_i]; } $cat_target[] = $_row; } //csvファイル上書き(後々使えそうなコード) // $res_file = fopen($path_parts['filename'].".csv", 'w+'); // foreach($target as $ary_csv_line){ // fputcsv($res_file, $ary_csv_line); // } // fclose($res_file); function get_csv_data($filename) { $fp = new SplFileObject($filename); $fp->setFlags(SplFileObject::READ_CSV); $data = array(); foreach ($fp as $line) { $data[] = $line; } return $data; }

それぞれの配列を取ってこれましたが、これをどう比較して上書きしていくのかが不明です。。
よろしくお願いいたします

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

データ整形の質問がしたいのであれば、整形のための仕様を明確に記述してください

csv ファイルが正規化されてても意味を持たないので、個人的には RDB に突っ込んで整理するのが良いと思います。

スクリプトで対応するのであれば、キーとなる id を配列のキーとして使用できるように、csv 読み込み時に加工しておくと、整形が効率的に実施できます。

投稿2018/09/28 00:00

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

超単純に考えるならば、こんな感じ?
(動作未検証/雰囲気のみなので適宜修正してください)

PHP

1//変更後のCSV用に新たな配列を作る 2$result = array(); 3 4//カテゴリチェック 5foreach ($product_target as $product) { 6 foreach ($cat_target as $cat) { 7 if ($product[0] == $cat[0] && $product[1] == $cat[1]) { 8 //合致したのが見付かったら、変更後のCSV用配列に入れる 9 $result[] = array($cat[2], $product[2], $product[3]); 10 break; 11 } 12 } 13} 14//※「合致するカテゴリーが見付からなかった場合」は無視してます。 15//※緩い比較にしているので表記ブレありそうならそこもご注意願います。 16//※合致したのを探す処理、もうちょっとスマートに書けそうですが「手始めに」ということで。 17 18//この後 $result をCSVファイルとして書き出し処理をする

投稿2018/09/28 00:49

sakura_hana

総合スコア11425

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazoogon

2018/09/28 11:18

こちら参考にして無事にできました、ありがとうございました。
guest

0

ハッシュ値を比べてはどうでしょう?

if(md5_file("./product.csv") != md5_file("./cat.csv")) { // 上書き処理 }

投稿2018/09/27 23:38

taka2063

総合スコア307

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問