【发布时间】:2016-02-13 14:03:05
【问题描述】:
我有如下 csv 数据:
"E12 98003";1085894;"HELLA";"8GS007949261";"";1
"5 3/4"";652493;"HELLA";"9HD140976001";"";1
某些字段包含在双引号中。问题是 正如您在第二行中看到的那样,第一列中的数据在末尾包含一个双引号作为数据的一部分。
我尝试了一些类似的方法:
LOAD DATA INFILE file.csv
INTO TABLE mytable
FIELDS TERMINATED BY ';' ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
但它会使用数据中的引号来转义包含引号的字段。我还尝试了ESCAPED BY '' 和ESCAPED BY '\\',但没有成功。
有没有办法阻止LOAD DATA INFILE 命令转义双双引号?
或者我应该解析csv并在只有一个时加上双引号?
无论如何,我正在使用 powershell 解析文件以将编码更改为 utf8。有什么方法可以快速解决这个问题吗?我的PowerShell代码:
function Convert-FileToUTF8 {
param([string]$infile,
[string]$outfile,
[System.Int32]$encodingCode)
$encoding = [System.Text.Encoding]::GetEncoding($encodingCode)
$text = [System.IO.File]::ReadAllText($infile, $encoding)
[System.IO.File]::WriteAllText($outfile, $text)
}
好的,我使用 .NET 正则表达式来修复 csv。这是昂贵的,但不是太多。 我写了
$text = [regex]::Replace($text, "(?m)(?<!^)(?<!\;)""(?!\;)(?!\r?$)", '""');
就在函数的最后一行之前,它似乎工作正常。由于我是正则表达式的新手,这可能会有所改进。
【问题讨论】:
-
主要问题是输入数据是无效的CSV格式,因为属于数据的双引号应该已经加倍(转义)了。所以问题就变成了:你从哪里得到这个无效的 CSV,你能做些什么来修复它?
-
它是从第三方软件导出的。不幸的是,我无法控制如何创建 csv。
标签: mysql csv escaping load-data-infile