MySQL有一个很好的CSV导入功能LOAD DATA INFILE
。
我有一个需要定期从CSV导入的大型数据集,因此这个功能正是我所需要的。我有一个可以完美导入数据的工作脚本。
.....除了....我事先并不知道终结终结者会是什么。
我的SQL代码目前看起来像这样:
LOAD DATA INFILE '{fileName}'
INTO TABLE {importTable}
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
( {fieldList} );
这适用于某些导入文件。
但是,导入数据来自多个来源。其中一些人有\n
终结者;其他人有\r\n
。我无法预测我会拥有哪一个。
是否有办法使用LOAD DATA INFILE
指定我的行可能会以\n
或\r\n
终止?我该如何处理?
答案 0 :(得分:10)
我只是预处理它。作为导入过程的一部分,从命令行工具更改\ r \ n到\ n的全局搜索/替换应该是简单且高效的。
答案 1 :(得分:10)
您可以将行分隔符指定为'\ n',并在加载期间从最后一个字段中删除尾随'\ r'分隔符。
例如 -
假设我们有'entries.txt'文件。行分隔符为'\ r \ n',并且仅在行ITEM2 | CLASS3 | DATE2
之后,分隔符为'\ n':
COL1 | COL2 | COL3
ITEM1 | CLASS1 | DATE1
ITEM2 | CLASS3 | DATE2
ITEM3 | CLASS1 | DATE3
ITEM4 | CLASS2 | DATE4
CREATE TABLE语句:
CREATE TABLE entries(
column1 VARCHAR(255) DEFAULT NULL,
column2 VARCHAR(255) DEFAULT NULL,
column3 VARCHAR(255) DEFAULT NULL
)
我们的LOAD DATA INFILE查询:
LOAD DATA INFILE 'entries.txt' INTO TABLE entries
FIELDS TERMINATED BY '|'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(column1, column2, @var)
SET column3 = TRIM(TRAILING '\r' FROM @var);
显示结果:
SELECT * FROM entries;
+---------+----------+---------+
| column1 | column2 | column3 |
+---------+----------+---------+
| ITEM1 | CLASS1 | DATE1 |
| ITEM2 | CLASS3 | DATE2 |
| ITEM3 | CLASS1 | DATE3 |
| ITEM4 | CLASS2 | DATE4 |
+---------+----------+---------+
答案 2 :(得分:3)
我假设你只需通过mysql no来获取任何编程语言的信息。 在使用之前,如果您有notepad ++,则加载数据会将格式转换为 Windows格式 \ r \ n(CR LF)。然后处理加载数据查询。确保LINES TERMINATED BY'\ r \ n'
修改强>
由于编辑器通常不适合转换较大的文件。对于较大的文件,以下命令通常用于windows和linux
1)在Windows中转换为Windows格式
TYPE [unix_file] | FIND "" /V > dos_file
2)在linux中转换为windows格式
unix2dos [file]
其他命令也可用
只需删除所有ASCII CR \ r 字符,即可将Windows格式文件转换为Unix格式 tr -d'\ r'< inputfile> OUTPUTFILE
grep -PL $'\r\n' myfile.txt # show UNIX format style file (LF terminated)
grep -Pl $'\r\n' myfile.txt # show WINDOS format style file (CRLF terminated)
在linux / unix中, 文件 命令检测所使用的行尾(EOL)类型。因此可以使用此命令检查文件类型
答案 3 :(得分:1)
您还可以查看其中一个数据集成包。 Talend Open Studio具有非常灵活的数据输入例程。例如,您可以使用一组分隔符处理文件并捕获拒绝并以另一种方式处理它们。
答案 4 :(得分:1)
如果第一个加载有0行,则使用另一个行终止符执行相同的语句。这应该可以通过一些基本的计数逻辑来实现。
至少它保留在SQL中,如果它在你第一次获胜时有效。并且可以减少重新扫描所有行并删除特定字符的麻烦。
答案 5 :(得分:1)
为什么不首先看一下线条的结束方式?
$handle = fopen('inputFile.csv', 'r');
$i = 0;
if ($handle) {
while (($buffer = fgets($handle)) !== false) {
$s = substr($buffer,-50);
echo $s;
echo preg_match('/\r/', $s) ? 'cr ' : '-- ';
echo preg_match('/\n/', $s) ? 'nl<br>' : '--<br>';
if( $i++ > 5)
break;
}
fclose($handle);
}
答案 6 :(得分:0)
您可以使用LINES STARTING分隔文本中的常规行尾和新行:
LOAD DATA LOCAL INFILE '/home/laptop/Downloads/field3-utf8.csv'
IGNORE INTO TABLE Field FIELDS
TERMINATED BY ';'
OPTIONALLY ENCLOSED BY '^'
LINES STARTING BY '^'
TERMINATED BY '\r\n'
(Id, Form_id, Name, Value)
对于带有“”字符的普通CSV文件,它将是:
...
LINES STARTING BY '"'
...