首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL无法从jq生成的CSV中检测换行

MySQL无法从jq生成的CSV中检测换行
EN

Stack Overflow用户
提问于 2019-12-22 19:30:23
回答 1查看 176关注 0票数 0

我编写了一个小型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中的字段与表匹配。

这是我的剧本:

代码语言:javascript
复制
#!/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没有看到换行符吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-22 19:48:56

问题的出现是因为您在SQL命令中读取的方式。

举例而言,考虑:

代码语言:javascript
复制
#!/bin/bash
read -d '' SQL1 << EOM
    LINES TERMINATED BY '\n'
EOM

echo "$SQL1"

这就产生了:

代码语言:javascript
复制
LINES TERMINATED BY 'n'

因此,如果要使用HEREDOC技术指定以值结尾的行,则需要编写

代码语言:javascript
复制
LINES TERMINATED BY '\\\n'

或者使用-r选项read

由于\n被认为是默认的(至少在MYSQL V8中是这样),所以您可以尝试省略按规范结束的行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59447428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档