只需使用php读取文件csv中的新行

时间:2018-10-03 04:58:38

标签: php csv

在这种情况下:

我有一个csv文件和一个程序php文件。 php程序文件从csv文件中读取数据并插入数据库,程序php设置了间隔,每5秒重新加载csv文件。

问题:

如何创建一个php程序,该程序仅从CSV文件中读取新行并将其插入数据库,而无需再次读取CSV中的所有数据?

2 个答案:

答案 0 :(得分:-1)

第一次读取文件时,请将行数保存在会话或数据库表之类的位置,下次读取文件时,请从行号之前的行号开始读取文件。然后保存文件数据并将行号增加到新值。

答案 1 :(得分:-1)

这是一个例子

$f = fopen('file.csv', 'w');
$headers = [];

$offset = 0;
//select offset from DB

while(!feof($f)){
   if(empty($headers)){
      $headers = fgetcsv($f);
      if($offset) fseek($f, $last_offset);
      continue; //skip to the next iteration on header row
   }
   $data = fgetcsv($f);

   //combine 2 equal length arrays, with array1 as the keys and array2 as the values
   $row = array_combine($headers, $data);
   //get the file pointer offset to save in the DB row
   $current_offset = ftell($f);

   //save in DB

}

我没有介绍数据库部分,但是ftell将为您提供文件指针的位置(以字节为单位)。这是当前读/写指针所在的位置。现在,当您保存每一行时,请添加名为file_offset的列或其他内容。不要使用offset,因为它是MySql中的保留字

然后,当您打开csv时,将获得数据库中的最大偏移量,例如

  SELECT MAX(file_offset) as last_offset FROM table

然后在拉标题行(这是我添加的奖励)之后,使用fseek和最后的偏移量作为此读取尝试的起点。

简单。

现在,如果您不喜欢使用字节偏移量,则可以使用SPLFileObject类,该类也可以读取CSV,但是它使用行号。

http://php.net/manual/en/function.ftell.php

http://php.net/manual/en/function.fseek.php

http://php.net/manual/en/class.splfileobject.php

我要回答的问题是告诉您至少发布了一些代码,但是我看到有人回答了。

无论如何,祝你好运。