a.csvがあります

a.csv
============
みかん,宮崎,-4,
みかん,宮崎,10,
りんご,宮崎,3,
りんご,宮崎,-7,
みかん,大阪,-4,
みかん,大阪,4,
りんご,大阪,5,
りんご,大阪,-8,
============
があります
これを1列目と2列目が同じものの3列目の数字を合計して
b.csvとして出力したいです
こんな感じ↓
========
みかん,宮崎,6,
りんご,宮崎,-4,
みかん,大阪,0,
りんご,大阪,-3,
========

どのようなphpを組めばいいでしょうか?
こちらの質問の続きです

http://q.hatena.ne.jp/1465916346

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2016/06/17 16:32:46

ベストアンサー

id:tobeoscontinue No.1

回答回数220ベストアンサー獲得回数59

<?php
function str_quote($ary, $c=',', $t="\n") {
  $str = '';
  foreach ($ary as $k=>$v)
    $str .= $k.$c.$v.$t;
  return $str;
}

$csv = [];
foreach(file('a.csv') as $line) {
  list($fruit, $local, $value) = explode(',', trim($line));
  $name = $fruit.','.$local;
  $csv["$name"] = (array_key_exists($name, $csv) 
                    ? $csv["$name"]: 0)+intval($value);
}

file_put_contents('hoge.cvs', str_quote($csv));

1列目と2列目が同じものというのは1列目と2列目を結合して1列目とすることで
http://q.hatena.ne.jp/1465916346 と同一になります。
ファイルに出力するために$csvを文字列化する関数str_quoteとしました。
制限:a.csvで数字の後にカンマがあるので4列になっていますが無視しています。
またファイルに出力する最は後ろにカンマをつけていないので必要ならstr_quoteの
$k.$c.$v.$t;の部分を
$k.$c.$v.$c.$t;とする必要があります。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません