Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP在MySQL中导入CSV_Php_Mysql_Symfony_Csv_Import - Fatal编程技术网

使用PHP在MySQL中导入CSV

使用PHP在MySQL中导入CSV,php,mysql,symfony,csv,import,Php,Mysql,Symfony,Csv,Import,我正在尝试在MySQL数据库中导入巨大的csv(>1Gb)文件: /** * @param $file_path */ private function importFileContents($file_path) { $query = sprintf("LOAD DATA LOCAL INFILE '%s' INTO TABLE file_import_contents FIELDS

我正在尝试在MySQL数据库中导入巨大的csv(>1Gb)文件:

/**
 * @param $file_path
 */
private function importFileContents($file_path)
{
    $query = sprintf("LOAD DATA LOCAL INFILE '%s' 
                        INTO TABLE file_import_contents 
                        FIELDS TERMINATED BY ';'
                        LINES TERMINATED BY '\\n'
                        IGNORE 1 LINES
                        (@col1, @col2, @col3, @col4, @col5, @col6, @col7, @col8, @col9, @col10, @col11, @col12, @col13, @col14, @col15, @col16, @col17, @col18, @col19, @col20, @col21) 
                        set add_params=@col1, available=@col2, category_id=@col3, currency_id=@col4, delivery=@col5, description=@col6, model=@col8, modified_time=@col9, name=@col10, oldprice=@col11, param=@col12, pickup=@col13, picture=@col14, price=@col15, sales_notes=@col16, type=@col17, type_prefix=@col18, url=@col19, vendor=@col20, vendor_code=@col21  
                    ", addslashes($file_path));

    $em = $this->getContainer()->get('doctrine.orm.default_entity_manager');
    $connection = $em->getConnection();
    $statement = $connection->prepare($query);
    $statement->execute();
}
问题是导入后在db中执行sql计数时:

SELECT COUNT(*) FROM file_import_contents;
它返回我1 648 990行,但当我在终端中运行命令以计算所有csv文件中的行时:

find ./ -type f -name "*csv*" -exec wc -w {} +
它返回总行数76319426。。。 我的php参数是:

upload\u max\u filesize=3200m
最大执行时间=300000
最大输入时间=600000
内存限制=1024M


…并在脚本中:

ini_集('memory_limit','-1')



为什么会发生这种情况?我怎样才能完全上传这些文件?感谢您的建议

在解析CSV文件并将其注入数据库时,您运行查询的服务器可能无法提供足够的内存来保存CSV文件。因此,无论您如何尝试配置设置,它都将始终失败


<>我会考虑将CSV划分成更小的块,并且我也会检查以确保导入的数据不失真,以防脚本没有正确读取行尾。< /P> < P> OK,它正在工作。计算终端中的行时出错:

find ./ -type f -name "*csv*" -exec wc -w {} +
相反-w必须是-l

find ./ -type f -name "*csv*" -exec wc -l {} +
结果localhost在102秒内运行了200万行


可以逐行执行,使用SplFileObject和fgetcsv()读取每一行,然后插入。这意味着您可以一次处理一条记录中的无用数据。这将是缓慢的,但它应该工作。我已经尝试了导入与联赛\Csv\Reader行行,但它的良好工作与文件只有约30-50Mb,但如果文件是1Gb-导入大约需要几个小时