如何在Vim中快速将CSV文件重新格式化为SQL格式?

时间:2013-11-04 18:57:10

标签: mysql csv vim

我有一个CSV文件,我需要格式化(即,转换成)一个SQL文件,以便摄入MySQL。我正在寻找一种方法来添加文本分隔符(单引号)到文本,但不是数字,布尔值等。我发现它很难,因为我需要用单引号括起来的一些文本有逗号本身,难以键入逗号进行搜索和替换。以下是我正在使用的示例行:

1239,1998-08-26,'Severe Storm(s)','Texas,Val Verde,"DEL RIO, PARKS",'No',25,"412,007.74"

这是FEMA数据文件,有131246行,我从data.gov下载,我试图进入MySQL数据库。正如你所看到的,我需要在德克萨斯之后和Val Verde之前插入一个单引号,所以我尝试了:

s/,/','/3

但是这只替换了文件前三行中第一次出现的逗号。一旦我越过那个,我将需要找到一种方法来处理“DEL RIO,PARKS”,因为它有一个逗号,我不想放一个单引号。

那么,是否有一种“好的”方法来操纵这些数据以将其从普通的CSV转换为正确的SQL格式?

由于

4 个答案:

答案 0 :(得分:2)

众所周知,CSV文件很难解析。不同的程序以不同的方式导出CSV,可能包括在引用字段中嵌入新行或在引用字段内表示引号的不同方式等异常。您最好使用专门解析CSV的工具 - perl,python,ruby和java都有CSV解析库,或者有命令行程序,如csvtool或ffe。

如果您使用脚本语言的CSV库,您也可以利用语言的SQL导入。这对于一次性来说有点过分,但如果您以这种方式导入大量数据,或者如果您正在转换数据,则可能是值得的。

我认为我还想做一些故障排除,以找出导入MYSql的CSV失败的原因。

答案 1 :(得分:0)

我会采取这样的方法:

:%S /,\( “[^”] * “\ | [^,”] * \)/, '\ 1'/ G

:%S / ^ \( “[^”] * “\ | [^,”] * \)/ '\ 1'/ G

在单词中,查找双引号字符集,或\ |,以逗号开头的非双引号字符集,并在单引号中替换字符集。

接下来,对于连续的第一列,查找双引号字符集,或\ |,以逗号开头的非双引号字符集,并在单引号中替换字符集。 / p>

答案 2 :(得分:0)

试试csv插件。它允许将数据转换为其他格式。该帮助包括一个示例,如何转换数据以将其导入数据库

答案 3 :(得分:0)

为了结束这个,我最终使用了@Eric Andres的想法,这是MySQL加载数据选项:

LOAD DATA LOCAL INFILE '/path/to/file.csv'
INTO TABLE MYTABLE FIELDS TERMINATED BY ',' LINES TERMINATED BY '\r\n';

最初的.csv文件仍然进行了一些按摩,但没有像我手工做的那么多。

当我评论LOAD DATA截断了我的文件时,我错了。我将该文件视为典型的.sql文件,并假设我添加的“ID”列将自动递增。结果并非如此。我必须创建一个快速脚本,在每行的前面添加一个ID。之后,LOAD DATA命令适用于我文件中的所有行。换句话说,所有数据都必须在文件中就位,以便在加载之前加载,否则加载将无法工作。

再次感谢所有回复的人,以及@Eric Andres的最终用途。