- ベストアンサー
csvデータの開始行と最終行を全体の4分の1で区切り処理をしたい
- csvデータの開始行と最終行を全体の4分の1で区切り処理をしたいと思っています。csvファイルは20万件あります。4分の1なので1~50000件となります。
- 処理方法については、while文を使用し、1行ずつ処理する方法が考えられますが、データ量が大きいため効率的な方法を模索しています。
- 毎回のデータ量が変動するため、while文の周辺を調整する必要があるかもしれませんが、具体的な方法についてはまだわかりません。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
$max_line = 200000 ; #などとしておけば、データ件数が変わっても変更箇所がわかりやすい #$max_line = $ARGV[0] ; #などと、コマンドライン引数を使う方法もある。 $start_line = 1 + $max_line /4 ; #開始行 $end_line = $start_line - 1 + $max_line /4; #終了行: 開始行+表示させる行数だと、1行多いことに注意 open(OUT,">${csv}"); open(IN, $data ) || &error(" $data を読み込みopen出来ません"); $lno = 0 ; #現在の行数を記録する変数 while($lines = <IN>) { $lno ++ ; # 1行読みこめたのでインクリメント if ( $lno < $start_line ) { next ; #開始行になってなかったら次の行へ } # splitのマニュアル見ても、split /正規表現/ って書式しか載ってないなぁ # ,は別に特殊な正規表現でないから、\は不要 ($seq1,$categ,$password,$imail,$cont) = split(/,/, $lines); #ただ表示するだけなら、 printでまとめてしまってもよい print OUT "${seq1},${cont} ,1\n"; # あと、入力ファイル名と、表示用に一時利用する文字列に、 # 同じ $data変数を利用していますが、同じ変数に違う意味を持たせるのは、 # 間違いのもとなので、避けた方がよいでしょう。 if ( $lno >= $end_line ) { break ; # 終了行だったら即時にループを終了 } } close IN; close OUT;
お礼
回答ありがとうございます。 早速やってみました。 バッチリエラーなく動作いたしました。 いつも助けていただきありがとうございます。