如何使用 PHP 从 CSV 文件中读取和删除行?

Tia*_*tro 3 php

我有一个包含电子邮件列的大 csv 文件。我需要创建一个脚本来读取这个 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);
Run Code Online (Sandbox Code Playgroud)

谢谢

Don*_*nic 5

我突然想到,如果您从文件末尾而不是开头读取行,它可以工作。我从这里得到了一些帮助,弄清楚如何做到这一点,并将那里的答案中的一些代码合并到一个函数中,该函数从文件末尾向后搜索到最后一行的开头。

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

使用该函数,您可以重复读取最后一行的结尾,然后将文件截断为该行开头的文件位置所指示的长度。

$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);
Run Code Online (Sandbox Code Playgroud)

我不知道我是否认为这通常是一个好主意(数据库似乎更容易处理),但我只是想弄清楚是否有办法完成它,这似乎确实在我有限的测试中工作。