在这种情况下:
我有一个csv
文件和一个程序php
文件。 php程序文件从csv
文件中读取数据并插入数据库,程序php
设置了间隔,每5秒重新加载csv
文件。
问题:
如何创建一个php
程序,该程序仅从CSV
文件中读取新行并将其插入数据库,而无需再次读取CSV
中的所有数据?
答案 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
我要回答的问题是告诉您至少发布了一些代码,但是我看到有人回答了。
无论如何,祝你好运。