想象一下,您有一个CSV文件,其中只包含文字,行结尾为\r\n
。
像这样:
abc
def
hij
...
xyz
您希望在现有的多列表中导入此文件,其中每行文本需要放在表的一个特定(当前为空)列(将其命名为needed
)的行中。像这样:
| a | b | c |needed|
|foo|bar|baz|______|
< - abc
|foo|bar|baz|______|
< - def
...
|foo|bar|baz|______|
< - xyz
CSV文件中的数据不需要按特定顺序插入。 needed
哪个字段包含CSV中的哪些数据并不重要,只要每行都导入,一切都很好。
我已经尝试了很多东西,它让我很生气,但我无法弄清楚,如何做到这一点。可以通过LOAD DATA INFILE和update / replace / insert命令以某种方式解决这个问题吗?在这样的情况下你会做什么?甚至可以用mysql吗?或者我需要一个自定义的PHP脚本吗?
我希望这个问题足够明确。如果您不清楚,请询问。
答案 0 :(得分:1)
好的,你走了......
向填充了1-600,000
的stuff
添加新列
ALTER TABLE stuff ADD COLUMN newId INTEGER UNIQUE AUTO_INCREMENT;
为CSV文件创建临时表
CREATE TABLE temp (
id INTEGER PRIMARY KEY AUTO_INCREMENT,
data VARCHAR(32)
);
我猜测所需的数据长度。
导入临时表
LOAD DATA INFILE <wherever> INTO TABLE temp;
将数据添加到stuff
UPDATE stuff AS s
JOIN temp AS t ON t.id=s.newId
SET s.needed=t.data;
整理
DROP TABLE temp;
ALTER TABLE stuff DROP COLUMN newId;
我必须承认我没有测试LOAD DATA INFILE
或UPDATE
语句,但我检查了所有表格。特别是,MySQL将使用连续数字填充newId
列。
如果stuff
中的行数与csv文件中的行数不匹配,我认为不会出现问题 - 很明显,会有几行{{1}如果行数少于行,则仍为NULL。
答案 1 :(得分:0)
我找到的最简单的方法是使用Libreoffice Calc + Base。 Import/Export Data in Base.
但是,如果你在列中有“not null”选项,并且错误地存在一个没有数据的单元格,那么该行将被删除。
首先从列中禁用not null选项。
哦,有Microsoft Office Excel的方式,但我没有这样做,因为它需要一个插件来安装,我很懒。