如何将包含反斜杠的csv文件导入MySQL

时间:2013-08-23 14:05:05

标签: mysql csv escaping backslash

我正在尝试将27797行的大型csv文件导入MySQL。这是我的代码:

load data local infile 'foo.csv' into table bar fields terminated by ',' enclosed by '"' lines terminated by '\n' ignore 1 lines;

工作正常。但是,此文件的某些行包含反斜杠(\),例如:

"40395383771234304","40393156566585344","84996340","","","2011-02-23 12:59:44 +0000","引力波宇宙广播系统零号控制站","@woiu 太好了"
"40395151830421504","40392270645563392","23063222","","","2011-02-23 12:58:49 +0000","引力波宇宙广播系统零号控制站","@wx0 确切地讲安全电压是\""不高于36V\""而不是\""36V\"", 呵呵. 话说要如何才能测它的电压呢?"
"40391869477158912","40390512645124096","23063222","","","2011-02-23 12:45:46 +0000","引力波宇宙广播系统零号控制站","@wx0 这是别人的测量结果, 我没验证过. 不过麻麻的感觉的确是存在的, 而且用适配器充电时麻感比用电脑的前置USB接口充电高"

"15637769883","15637418359","35192559","","","2010-06-07 15:44:15 +0000","强互作用力宇宙探测器","@Hc95 那就不是DOS程序啦,只是个命令行程序,就像Android里的adb.exe。$ adb push d:\hc95.tar.gz /tmp/ $ adb pull /system/hc95/eyes d:\re\"

导入后,带有反斜杠的行将被破坏。

我该如何解决?我应该使用sedawk将所有\替换为\(27797行内......)吗?或者这可以通过修改SQL查询来解决?

2 个答案:

答案 0 :(得分:0)

这更多的是讨论,而不是直接的答案。在最终数据(在DB中)的值中间是否需要双引号?事实上,你有大量的数据可以完全没有任何问题。

“”这就是Oracle为字符串中的引号所做的事情。我认为无论构建该文件是什么试图逃避引用序列。 This是MySQL的字符串手册。其中任何一个都有效::

select "hel""lo", "\"hello";

我倾向于单独对导入进行编辑,因此更容易/更快地查看是否有效。如果您的文字文件小于10MB,则通过sed更新文本文件的时间不应超过一分钟。

sed -e 's/\\//' foo.csv

根据您的评论,您可以将转义字符设置为“\”以外的其他字符。

ESCAPED BY 'char'

这意味着加载程序应逐字添加值。如果它变得太复杂,如果在插入数据之前使用base64()数据,这将阻止任何工具破坏UTf8序列。

答案 1 :(得分:0)

在类似情况下,我首先在测试应用程序中创建了一个Java字符串。然后编译测试类并修复我发现的所有错误。

例如:

`String me= "LOAD DATA LOCAL INFILE 'X:/access.log/' REPLACE INTO TABLE `logrecords"+"`\n"+
"FIELDS TERMINATED BY \'|\'\n"+
"ENCLOSED BY \'\"\'\n"+
     "ESCAPED BY \'\\\\\'\n"+
     "LINES TERMINATED BY \'\\r\\n\'(\n"+
     "`startDate` ,\n"+
     "`IP` ,\n"+
     "`request` ,\n"+
     "`threshold` ,\n"+
     "`useragent`\n"+
     ")";
    System.out.println("" +me);

enter code here