【问题标题】:LOAD DATA INFILE usage to import CSV?LOAD DATA INFILE 用于导入 CSV?
【发布时间】:2013-10-24 12:28:11
【问题描述】:

在本地机器上工作的一般 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'。同样,在一个 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

【问题讨论】:

  • 我已经使用了这个加载文件选项,但据我所知,您需要检查该选项并手动提供并相应地运行加载文件脚本。
  • 我正在使用这个名为 FasterCSV 的 gem 来读取 csv 文件...知道它是否可用于检测 CSV 格式并将其返回到查询中吗?
  • 我不知道。
  • DBM 能够更快地加载 CSV。 terminated byenclosed byescaped by 允许您定义 CSV 或 TSV 记录,无论您是在 Ruby 还是 SQL 中都必须设置它们。 built-in CSV class,在幕后是 FasterCSV。另外,不要请求帮助。表现出努力的好问题会得到支持,人们提供答案不是因为恳求或因为他们是新人。通过显示您为解决此问题而编写的一些代码,表明您已经付出了努力。
  • 即使我使用内置 CSV(与 FasterCSV 非常相似),我也需要执行 Load Infile 才能导入修复所在的文件内容,因为我不知道为terminated byescaped byenclosed by 提供的参数。我正在使用 ruby​​,因为我正在开发一个正在调用它的 rails 应用程序。关于请的部分,你是对的:)

标签: mysql ruby-on-rails ruby csv load-data-infile


【解决方案1】:

我也遇到了这个问题,所以我最终在加载每个文件之前为一些“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] + "'");
}

【讨论】:

    猜你喜欢
    • 2016-07-30
    • 2011-05-28
    • 2011-10-24
    • 2021-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    相关资源
    最近更新 更多