2013-10-24 39 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] + "'"); 
}