我编写了一个小型Bash脚本,将JSON文件读入CSV,以便导入到MySQL中。下面的示例是我们所拥有的简化版本-- JSON非常复杂,因此很难直接导入MySQL。
CSV将允许我们将数据导入到临时表中,并以多种不同的方式使用数据并进行验证等。
我们的问题是,MySQL使用'\n'无法识别生成的CSV文件中的换行。我已经尝试过'\r\n',并使用file -k验证了文件类型(ASCII text, with very long lines)。我可以成功地计数命令行中的'\n'数,因此我确信文本文件是正确生成的。
无论如何,MySQL无法识别ERROR 1262 (01000) at line 5: Row 1 was truncated; it contained more data than there were input columns终止行的行中断。
将文件编辑成一行成功地导入,因此我知道CSV中的字段与表匹配。
这是我的剧本:
#!/bin/bash
{
# Define variables
source "$_source/../_config.sh"
_today=$(date '+%Y-%m-%d');
_source="$(dirname "$0")"
jq -r '.data | [.val1, .val2, .val3] | @csv' <$_source/raw/"$_today".json >raw/"$_today".csv
read -d '' SQL1 << EOM
set unique_checks = 0;
set foreign_key_checks = 0;
set sql_log_bin=0;
LOAD DATA LOCAL INFILE 'raw/"$_today".csv'
REPLACE INTO TABLE imports
CHARACTER SET utf8
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
(@col1, @col2, @col3)
SET
val1 = TRIM(@col1),
val2 = TRIM(@col2),
val3 = TRIM(@col3)
;
EOM
_result=$(echo "$SQL1" | mysql $_db -u$_user -p$_pass -s -N)
}在jq中,我也尝试过-a和-c标志,但没有明显的区别。知道为什么MySQL没有看到换行符吗?
发布于 2019-12-22 19:48:56
问题的出现是因为您在SQL命令中读取的方式。
举例而言,考虑:
#!/bin/bash
read -d '' SQL1 << EOM
LINES TERMINATED BY '\n'
EOM
echo "$SQL1"这就产生了:
LINES TERMINATED BY 'n'因此,如果要使用HEREDOC技术指定以值结尾的行,则需要编写
LINES TERMINATED BY '\\\n'或者使用-r选项read。
由于\n被认为是默认的(至少在MYSQL V8中是这样),所以您可以尝试省略按规范结束的行。
https://stackoverflow.com/questions/59447428
复制相似问题