2011-01-31 7 views
1

私は500kのデータを持つテキストファイルを持っています。ループ内でどこから停止したかを読み取るには?

ループを実行して情報を保存しています。何かのような..

$file = fopen("top-1-500000.txt", "r") or exit("Unable to open file!"); 
while(!feof($file)) { //some function 
mysql_query("INSERT INTO table (name) VALUES ('$value')"); 
    } fclose($file); 

ループは、その後、私は、テキストからの最初の行から再びそれを読むためにループを防ぐために、手動でMySQLデータベースを読み込むことで、既にテキストファイルから読み込んだデータを削除する必要が途中で停止したときに問題がありますファイル。これは複数のファイルに関して膨大な労力を要します。

+0

? 1行あたりの行数または1文字あたりの文字数? –

+0

行ごとに行を読み取る – leon

+0

ループが途中で停止するのはなぜですか?誰かが手動で(Ctrl-Cのように)スクリプトを終了していますか? –

答えて

2

大きなファイルを読み取る別の方法は、MySQL LOAD DATA INFILEの機能を使用することです。

例:あなたは、ファイルを読み込むにはどうすればよい

LOAD DATA INFILE 'top-1-500000.txt' INTO TABLE tbl_name 
    FIELDS TERMINATED BY ',' ENCLOSED BY '"' 
    LINES TERMINATED BY '\r\n' 
    IGNORE 1 LINES; 
0

ファイルを読むためにfile()を使用する場合は、ループバックが停止した場所に行く必要があるとき、あなただけの

$file_array = file("top-1-500000.txt"); 
for($i=0;$i<count($file_array);$i++) 
{ 
    // ...code here... 
    mysql_query("INSERT INTO table (name) VALUES ('$value')"); 
} 
そのカウンタを使用し、その後、forループの繰り返し回数をカウント内のカウンタを使用することができます

また、これはこれは

$line = fgets($handle); 

が01を読み込みますので、絶対に大規模なファイル

0

あなたが行毎にファイルを読んでいるされていないと仮定しています(これを指定できます)

fseekという名前の関数があり、内部ファイルポインタをナビゲートしてその場所から読み取ることができます。 可能な解決策は、データベースに読み取り行の数を保持し、ループが途中で終了した場合、$number_lines * 1024fseek() のオフセットにして読み込み続けます。

+0

改行がある場合、それは動作しません。 –

1

私は「中断された」と仮定していますが、スクリプトがタイムアウトしていることを意味します。スクリプトがタイムアウトしないようにするには、set_time_limitを使用する必要があります(私はあなたのサーバー設定でこれを許可していると仮定しています)。

+0

スクリプトは外部から終了しています。私はAPIを使用していますので制限があります。制限時間は100000 – leon

関連する問題