100M ぐらいあるファイルに
1 aaa bbb ccc ddd
2 xxx 222 111 333
このようにデータが100M分入っていますが、
スペースの3番目の値のみ重複チェックをして
重複したら、その行の中身を出力したいです。
まったく思いつかず。
お助けください!

回答3件
あなたの回答
tips
プレビュー
100M ぐらいあるファイルに
1 aaa bbb ccc ddd
2 xxx 222 111 333
このようにデータが100M分入っていますが、
スペースの3番目の値のみ重複チェックをして
重複したら、その行の中身を出力したいです。
まったく思いつかず。
お助けください!
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
重複チェック用の配列を作って、そこに値を貯めていくのが楽ではないでしょうか。
その際、配列は連想配列にするとチェックが楽です。
流れ的にはこんな感じでしょうか。
PHP
1while(EOFまでループ){ 2 1行読み込み 3 行をスペースで分割:explode) 4 連想配列にあるかチェック:isset(連想配列['分割した値']) 5 あったら1行分を出力 6 連想配列に値登録:連想配列['分割した値']=1(代入する値は何でもよい) 7}
投稿2017/07/06 01:47
総合スコア17002
0
ベストアンサー
最近はメモリもリッチだし 100M くらい大した事ないので一気に全体読んで行 split(explode) して array_key_exists すれば行けそうだけど。
php
1<?php 2$arr = []; 3$filename = 'aaa'; 4 5$f = fopen($filename, "r"); 6while (!feof($f)) { 7 $line = chop(fgets($f)); 8 if (empty($line)) { 9 continue; 10 } 11 $items = explode(' ', $line); 12 if (array_key_exists($items[3], $arr)) { 13 echo $line; 14 } else { 15 $arr[$items[3]] = NULL; 16 } 17} 18fclose($f); 19?>
投稿2017/07/06 02:07
総合スコア5030
0
結局全データの総当りチェックになるので相当重いと思いますができるとおもいますよ
普通やるならデータベースでしょうね
メモリに余裕があるならfgetcsvでセパレータにスペースを指定する
難しそうなら、3番めの要素をキーとする配列を出現する度にインクリメントして
一度ファイルを走査し、2以上になった要素を再度読み直すのが効率的でしょうか
投稿2017/07/06 01:55
編集2017/07/06 02:09総合スコア117906
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。