2013-10-24 69 views
0

一般LOAD DATA INFILE語法到本地機器上工作是:LOAD DATA INFILE用法導入CSV?

LOAD DATA [LOW_PRIORITY | CONCURRENT] LOCAL INFILE 'file_name' 
[REPLACE | IGNORE] 
INTO TABLE tbl_name 
[CHARACTER SET charset_name] 
[{FIELDS | COLUMNS} 
    [TERMINATED BY 'string'] 
    [[OPTIONALLY] ENCLOSED BY 'char'] 
    [ESCAPED BY 'char'] 
] 
[LINES 
    [STARTING BY 'string'] 
    [TERMINATED BY 'string'] 
] 
[IGNORE number LINES] 

我寫在Ruby程序,它應該是能夠導入各種CSV到一個MySQL表。

CSV文件完美地存儲在一個變量中,並獲取標題並完美地創建表格。問題是我得到的每個CSV文件都不同,並且必須修改參數LOAD DATA LOCAL INFILE才能識別CSV文件格式。

例如,在一個CSV中,LINES TERMINATED BY選項必須設置爲'\n',而在另一個CSV中必須設置爲'\r'。同樣,在一個CSV ESCAPED BY '[char]'必須存在才能正確導入,而在另一個CSV不得存在。

是否有任何可能的方式提供多個值來檢查?像TERMINATED BY '\n or \r'ENCLOSED BY '\ or "'

EDIT:

當我這樣做:

FasterCSV.foreach(csv) do |row| 
    @first = row 
    break 
end 

我得到的第一行。是否可以檢測該行終止符,無論是從該單行開始的\n還是\r\n\r

+0

我已經工作過這個加載文件選項,但根據我的知識,您需要檢查該選項並手動提供它並相應地運行加載文件腳本。 –

+0

我正在使用這個稱爲'FasterCSV'的gem來讀取csv文件...任何想法,如果它可以用來檢測CSV格式並將其返回到查詢? –

+0

我不知道這件事。 –

回答

0

我也有這個問題,所以我最終在加載每個文件之前編寫了一些「testLines」的迷你分析器。

public static void findTerminator(File file) throws FileNotFoundException { 
    BufferedReader lines = new BufferedReader(new FileReader(file)); 
    int countLines = 0; 
    int testLines = 15; 
    int c; 
    int[] terminators = { 0x0A, 0x0D, 0x0D0A }; //\n, \r, \r\n 
    int[] counters = { 0, 0, 0 }; 
    try { 
     while (((c = lines.read()) != -1) && (countLines <= testLines)) { 
      for (int d = 0; d < terminators.length; d++) { 
       if (c == terminators[d]) { 
        counters[d]++; 
        countLines++; 
       } 
      } 
     } 
    } 
    catch (IOException e) { e.printStackTrace(); } 

    int max = 0; 
    int maxindex = 0; 
    for (int i = 0; i < counters.length; i++) { 
     if (max < counters[i]) { 
      max = counters[i]; 
      maxindex = i; 
     } 
    } 
    terminator = (char)terminators[maxindex]; 
    System.out.println("Terminator: '" + terminators[maxindex] + "'"); 
}