2016-05-24 4 views
3

私は電子メールの列を含む大きなcsvファイルを持っています。私は、このcsvファイルを読み、電子メールを送信し、行を削除するスクリプトを作成する必要があります。一時ファイルを作成せずに行うことは可能ですか?データベースに保存する場合は、これを行う最善の方法でしょうか?PHPでCSVファイルの行を読み込み、削除するにはどうしたらいいですか?

マイコード:

if (($handle = fopen("emails.csv", "r")) !== FALSE) { 
while (($line = fgetcsv($handle, 1000, ",")) !== FALSE) { 
     $mail->parseTextandSendMail($line); 
     //Need to remove the $line 
    $row++; 
} 
fclose($handle); 

おかげ

+2

すべてのメールが送信されるので、ループを送信してからファイル全体を削除することはできません。 –

+1

@ダゴン:それは簡単すぎます。 – AbraCadaver

+0

私はデータベースが良い方法だと思う。 –

答えて

0

あなたがファイルの終わりはなく、最初から行を読めば、それは仕事ができることを私に起こりました。私はhereからの助けを得て、それを行う方法を考え出し、ファイルの終わりから最後の行の始めまで後方を探し出す関数にコードの一部を組み込んだ。その機能付

function lineStart($file) { 
    $position = ftell($file); 
    while (fgetc($file) != "\n") { 
     fseek($file, --$position); 
     if ($position == 0) break; 
    } 
    return $position; 
} 

、あなたが繰り返し、最後の行の末尾には、その行の先頭にファイル位置で示される長さにファイルを切り詰める読むことができます。

$file = fopen('emails.csv', 'r+');  // open for read/write 

fseek($file, -1, SEEK_END);    // move to end of file 

while (fstat($file)['size']) { 
    lineStart($file);     // move to beginning of line 
    $line = fgetcsv($file); 
    $mail->parseTextandSendMail($line); // do your email thing 
    ftruncate($file, lineStart($file)); // truncate from beginning of line 
} 

fclose($file); 

私は(に対処するためにはるかに容易になるようにデータベースはそう)、これは一般的に良いアイデアだと思うならば、私は知りませんが、私はちょうど達成するための方法があったかどうかを把握したかったですそれは私の限られたテストではうまくいくようです。

+0

ありがとう!!!!それはまさに私が必要なものです!私のサーバーがクラッシュした場合は、空のファイルを探してこのスクリプトを実行するためにcronを実行できます!どうもありがとうございます! –

関連する問題