使用 php 将 csv 中的相同值插入空行

Inserting same value from csv to empty rows using php

大家好, 我需要一些有关使用 php 在 mysql 中上传此数据的帮助。我不知道这个问题是否已经被问过,但我真的找不到答案所以任何帮助将不胜感激谢谢。

正如您在“来自 CSV 的数据”区域中看到的那样,这就是我上传数据的方式,但描述中存在空值,我需要使用 php 来填充这些值。如果文档相同,则描述也应该相同。

CSV Data VS Expected Result

您不需要 PHP。只需将 CSV 数据(使用任何工具或语言)导入临时 table,然后用 SQL 填充空白,最后将数据推送到主 table .这将使您从编码中解脱出来,并使过程更加高效和快速。

...Code to import CSV data to temporary table

UPDATE tmp_data
SET description = document
WHERE description = '' OR description IS NULL;

INSERT INTO main_data (account, document, description) 
SELECT account, document, description FROM tmp_data;

正在导入:

LOAD DATA INFILE
INTO TABLE tmp_table
{ importing options }
(AccountName, DocumentNo, Description);

更新中:

UPDATE tmp_table t1
JOIN tmp_table t2 USING (AccountName, DocumentNo)
SET t1.Description = t2.Description
WHERE t2.Description > '';

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=22c292e88fa4f9edae1c767bf81f070a

对于每个 (AccountName, DocumentNo) 对值,Description 中必须只有一个不同的非空值(即允许有多个非空值的行,但所有这些值都必须是相同的)。如果不是,那么输出是 unpredictable,此外,在某些行中,一个非空值可能会被另一个非空值替换。


当然,这一切都可以通过一个(正式的)查询来完成。

您可以使用 ENGINE = CSV 选项将 CSV 文件附加为 table,然后使用

将数据复制到其中
INSERT INTO tmp_table (AccountName, DocumentNo, Description)
SELECT AccountName, DocumentNo, t2.Description
FROM csv_table t1
JOIN csv_table t2 USING (AccountName, DocumentNo)
WHERE t2.Description > '';

但是您的 CSV 必须不能包含在导入过程中必须忽略的前缀行。

对于每个 (AccountName, DocumentNo) 对值,Description 中必须只有一个非空值。如果不是,那么 tmp_table 中的行数将成倍增加。但是您可以编辑查询并将 csv_table t2 替换为相应的子查询,该子查询区分每个 (AccountName, DocumentNo) 对值的 Description 值。