gpt4 book ai didi

mysql - 使用 LOAD DATA INFILE 导入 CSV?

转载 作者:行者123 更新时间:2023-11-30 01:09:14 25 4
gpt4 key购买 nike

在本地计算机上工作的通用 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 "'?

编辑:

当我这样做时:

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

我得到了第一行。是否可以检测单行中的行终止符,无论是 \n 还是 \r\n 还是 \r

最佳答案

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

关于mysql - 使用 LOAD DATA INFILE 导入 CSV?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19565955/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com