- ベストアンサー
CSVの列上下で照合し、一致したら繋げて1行にする
- CSVデータの列上下を照合し、同じ名前を持つ行を1行に結合する方法をご教示ください。
- 要素数が5000件になるように、CSVデータの同じ名前を持つ行を1行に結合した場合、どのようにデータが整理されるのか教えてください。
- PHPのスクリプトを使用して、CSVデータの同じ名前を持つ行を1行に結合する方法を教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
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')));
その他の回答 (2)
仕様を固めたほうがいい点に関してはyambejpさんに同意です。 とりあえずそれっぽいのを作ってみました。 http://ideone.com/FR3iRe
- yambejp
- ベストアンサー率51% (3827/7415)
ちなみに >下記のようなCSVデータがあります。 例示の仕方がわるいですね。 カンマ区切りなのにスペースでインデントすると回答がブレますよ。 また文字列中にカンマがはいる可能性がどのくらいあるか? 文字列をクォーテーションでくくったりしないのか? (つまり区切り文字としてのカンマと文字列としてのカンマの競合をどうするかということ) など仕様がかたまっていないとバグだらけになりそうですよ >上下で名前フィールドが一致したら、他の列の内容と日時を全て繋げて1つのフィールドに入れる というのは「連続した行」のみ対応とも読めます。 田中→吉田→田中 のような場合でも、どんどん田中にたしこんでよいのですよね?
お礼
とっても参考になるスクリプトありがとうございます! 無事に希望通りのスクリプトを作る事ができました!