从PHP导入CSV文件到SQLite3

时间:2016-03-14 22:51:23

标签: php csv sqlite

要创建SQLite3数据库并从PHP中插入来自外部CSV文件的值,我运行了:

$db=new SQLite3("QNH.sqlite");
$q="CREATE TABLE IF NOT EXISTS QNH(id INTEGER PRIMARY KEY,unixtimeutc INTEGER,stationqnh TEXT)";
$db->exec($q);unset($regel);$id=0;
if(($fp=fopen("QNH.csv","r"))!==false)
  {while(($regel=fgetcsv($fp,32,","))!==false)
        {$id++;
         $q="INSERT INTO QNH VALUES('".$id."','".$regel[0]."','".$regel[1]."')";
         $db->exec($q);}}
$v=fclose($fp);$db->close();

它可以工作......但是可笑而且无法使用,并且在完成之前它会在60秒的超时时间内完成。 总共只添加了733行105132。 按此速度,它将需要> 143分钟。 高清做了很多大惊小怪。 这显然不是这样做的方法。 我知道如何创建数据库并在SQLite3命令提示符下导入CSV文件,这可以在几秒钟内完成,但我需要从PHP脚本执行此操作。 我到处寻找,但无法找到SQLite3和PHP的特定内容。 有什么想法吗?

3 个答案:

答案 0 :(得分:0)

与大多数通用编程语言一样,PHP可以使用exec()shell_exec()使用命令行参数执行外部程序。这类似于Python的subprocess.call(),R的os.system(),Java的ProcessBuilder(),Perl的system(),C#和VB.NET的Process.Start()

考虑在.sql文件中运行sqlite csv import并在php中调用它:

SQL 脚本(另存为import.sql)

CREATE TABLE IF NOT EXISTS QNH(id INTEGER PRIMARY KEY,unixtimeutc INTEGER,stationqnh TEXT);
.separator ,
.mode csv
.import output.csv QNH

PHP 脚本(根据需要调整路径名称)

exec("sqlite3 yourdb.sqlite < import.sql")

答案 1 :(得分:0)

我实现了shell的想法,因为它编码简单,执行时间快:

$sql="shell_commands.qsl";$fp=fopen($sql,"w");
$v="create table QNH(unixtimeutc integer,stationqnh text);\n";
$v.=".separator \",\"\n.import ".$csv." QNH\n.exit";$v=fwrite($fp,$v);
$v=fclose($fp);$v=shell_exec("sqlite3.exe ".$db."<".$sql);

正如预期的那样,它的运行速度与手动导入一样快。 我还注意到SQLite3的不一致性:像“create”这样的关键字可以是大写,但“separator”等不能......

答案 2 :(得分:0)

您需要使用交易。参见https://www.php.net/manual/en/pdo.begintransaction.php

默认情况下,SQLite会将每个查询写入磁盘并同步磁盘。您说可以听到磁盘的声音,这意味着这不是SSD。因此,您受到磁盘旋转速度的限制。在5400 RPM下,需要进行几次访问(创建备份,同步文件系统目录,提交插入的行,删除备份,同步文件系统目录),您将获得预期的性能。

来源:https://www.sqlite.org/lang_transaction.html


对于您的完整解决方案,请考虑一次使用1000行的PHP array_chunk。您将看到至少100倍的性能提升。