我正在尝试将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\"
导入后,带有反斜杠的行将被破坏。
我该如何解决?我应该使用sed
或awk
将所有\
替换为\
(27797行内......)吗?或者这可以通过修改SQL查询来解决?
答案 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