0

在本地机器上工作的一般 LOAD DATA INFILE 语法是:

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'。同样,在一个 CSVESCAPED BY '[char]'中必须存在才能正确导入,而在另一个中则不能存在。

有没有可能提供多个值来检查的方法?喜欢TERMINATED BY '\n or \r'还是ENCLOSED BY '\ or "'

EDIT:

当我做:

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

我得到第一行。是否有可能检测到行终止符,无论是它的还是\n来自那一行?\r\n\r

4

1 回答 1

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] + "'");
}
于 2015-04-28T01:37:02.197 回答