電子書籍の厳選無料作品が豊富!

csvデータの開始行と最終行を全体の4分の1で区切り処理をしたい

csvデータの開始行と最終行を全体の4分の1で区切り処理をしたいと思ってます。
csvファイルは20万件あります。4分の1なので1~50000件となります。
今回は50001~100000件までを行いたいのですが、先日教えていただいたwhile($lines = <IN>) ですと、最初から1件ずつ最終行まで処理をしてしまいます。


(ここから)
open(OUT,">$csv");
open(IN,"$data") || &error(" $data を読み込みopen出来ません");
while($lines = <IN>) {
($seq1,$categ,$password,$imail,$cont) = split("\,", $lines);
$cont .= " ";
$data = "$seq1,$cont,1\n";
print OUT "$data";
$data = "";
}
close IN;
close OUT;
(ここまで)

今回は20万件ですが、毎回このデータ量は月次ごとに変わります。
while周辺をいじるような気がしていますがどのようになるのかがわからなかったので質問いたしました。

お手数かけます。

よろしくお願いいたします。

A 回答 (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;
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
早速やってみました。
バッチリエラーなく動作いたしました。

いつも助けていただきありがとうございます。

お礼日時:2010/07/24 22:23

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!