2016-02-13 133 views
1

我有一個像下面的CSV數據:防止LOAD DATA INFILE

"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?$)", '""'); 

只是在函數的最後一行之前,它似乎工作確定。由於我是正則表達式的新手,這可能可以改進。

+1

主要的問題是輸入數據是無效的CSV格式,因爲屬於數據的雙引號應該加倍(轉義)。所以問題就變成了:你從哪裏得到這個無效的CSV,你能做些什麼來解決它? – trincot

+0

它是從第三方軟件中導出的。不幸的是,我無法控制csv是如何創建的。 – pankal

回答

1

的主要問題是該輸入數據構成無效CSV語法,如在RFC-4180所述,第7段:

如果雙引號用於括字段,然後一個雙引號出現一個字段內必須通過在另一個雙引號之前進行轉義才能逃脫。

但在你的PowerShell腳本,你可以嘗試解決這個問題有一個額外的行,使用replace method$文字,一旦你得到了它的價值:

$text = $text.Replace('"";', '""";') 

這應該是足夠的,

如果該字段開頭:因爲如果他們在其他地方出現在數據上mysql.com(我的高亮顯示)作爲規定的裝載機將轉義雙引號處理好ENCLOSED BY字符,該字符的實例被識別爲終止字段值只有後接字段或行TERMINATED BY序列。

當然,如果格式不正確的CSV數據包含";,那麼您仍然有問題。但它是非常難以確定mysql.com因爲發現這樣的出現是否終止數據或應被視爲數據的一部分,甚至對人類:-)

另一件事要注意:

如果輸入值未必包含在引號內,請在ENCLOSED BY關鍵字前使用OPTIONALLY

+0

恐怕您的解決方案將只關注數據末尾的非雙引號。 – pankal

+1

是的,但MySql Load會將內部引號視爲它們(即使未轉義),但前提是它們沒有後跟字段或行分隔符。 – trincot

+0

它看起來很好......但是,困擾我的是,這種情況不能得到保證... – pankal