0

我正在尝试将一个包含 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了”
"403951518304215004","4039227064556392","23063222",""","2011-02-23 12:58:49 +0000","吸引力波波宇宙广播零号站控制,"@wx0真实系统地地"不讲安全电压是\"不讲36V\""而不是\""36V\"",呵呵。"话说要如何测它的电压呢?"
"40391869477158912","40390512645124096","23063222","","","2011-02-23 12:45:46 +0000","波这是宇宙广播系统零号站","@wx0的结果,我没有验证过用电脑充电时的感觉是麻麻的感觉。

"15637769883","15637418359","35192555,"","","206-07 15:44:15 +0000","强互不作用力宇宙","@Hc9 那么程序啦,只是个识别程序,就像Android里的ad.exe。$ adb push d:\hc95.tar\gz /tmp/ $ adb pull /system/hc95/eyes d:\re\gz"

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

我该如何解决?我应该使用sed还是awk全部替换\\(在 27797 行内......)?或者这可以通过修改 SQL 查询来解决?

4

2 回答 2

0

这更像是一个讨论而不是一个直接的答案。您是否需要在最终数据(在数据库中)的值中间添加双引号?您有大量数据需要处理这一事实根本不会出现任何问题。

"" 是 Oracle 为字符串中的引号所做的事情。我认为构建该文件的任何内容都试图逃避引用序列。 是 MySQL 的字符串手册。其中任何一个都是有效的::

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

我倾向于将编辑与导入分开进行,因此更容易/更快地查看事情是否有效。如果您的文本文件小于 10MB,则通过sed.

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

根据您的评论,您可以将转义字符设置为 '\' 以外的内容。

ESCAPED BY 'char'

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

于 2013-08-23T14:40:23.837 回答
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

于 2018-07-18T12:43:00.360 回答