2

我有一个 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 数据库。如您所见,我需要在 Texas 之后和 Val Verde 之前插入一个单引号,所以我尝试了:

s/,/','/3

但这仅替换了文件前三行中第一次出现的逗号。一旦我克服了这个问题,我将需要找到一种方法来处理“DEL RIO,PARKS”,因为它有一个逗号,我不想在周围加上单引号。

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

谢谢

4

4 回答 4

2

众所周知,CSV 文件难以解析。不同的程序以不同的方式导出 CSV,可能包括在引用字段中嵌入新行或在引用字段中表示引号的不同方式等奇怪之处。你最好使用专门适合解析 CSV 的工具——perl、python、ruby 和 java 都有 CSV 解析库,或者有命令行程序,例如 csvtool 或 ffe。

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

我想我还想做一些故障排除来找出为什么 CSV 导入 MYSql 失败。

于 2013-11-05T04:40:43.583 回答
0

我会采取这样的方法:

:%s/,\("[^"]*"\|[^,"]*\)/,'\1'/g

:%s/^\("[^"]*"\|[^,"]*\)/'\1'/g

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

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

于 2013-11-04T21:31:51.017 回答
0

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

于 2013-11-05T09:56:50.003 回答
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 的想法,我最终使用了这个想法。

于 2013-11-05T22:05:13.837 回答