【问题标题】:awk create a bulk MySQL insert from csvawk 从 csv 创建批量 MySQL 插入
【发布时间】:2013-05-14 13:37:26
【问题描述】:

我有一个包含数据的巨大 CSV 文件,我正在尝试生成 mySQL 批量插入语句。

CSV 中的数据如下所示

90927597|1356976813998|1356976814177|1356976817457|17756249959|17756249959|18663111085|17753220005|1090917|1775624995900|A
90927599|1356976813098|1356976814797|1356976823738|12562175250|12562175250|12566502514|12565207040|1890362|1256217525000|A
90927602|1356976813098|1356976814797|1356976823738|12562175250|12562175250|12566502514|12565207040|1890362|1256217525000|A
90927603|1356976813098|1356976814797|1356976823738|12562175250|12562175250|12566502514|12565207040|1890362|1256217525000|A

我希望创建一个批量插入,它将每 2 行组合成一个插入语句

具有所需输出的 ​​MySQL 语句

insert into data (90927597,1356976813998,1356976814177,1356976817457,17756249959,17756249959,18663111085,17753220005,1090917,1775624995900,A,90927599,1356976813098,1356976814797,1356976823738,12562175250,12562175250,12566502514,12565207040,1890362,1256217525000,A);
insert into data (90927602,1356976813098,1356976814797,1356976823738,12562175250,12562175250,12566502514,12565207040,1890362,1256217525000,A, 90927603,1356976813098,1356976814797,1356976823738,12562175250,12562175250,12566502514,12565207040,1890362,1256217525000,A);

谢谢

【问题讨论】:

    标签: mysql linux sed awk


    【解决方案1】:
    $ cat tst.awk
    BEGIN{ FS="|"; OFS="," }
    {
        $1 = $1
        head = ( (NR%2) == 1 ? tail "insert into data (" : "," )
        printf "%s%s", head, $0
        tail = ");\n"
    }
    END { printf "%s", tail }
    
    $ awk -f tst.awk file
    insert into data (90927597,1356976813998,1356976814177,1356976817457,17756249959,17756249959,18663111085,17753220005,1090917,1775624995900,A,90927599,1356976813098,1356976814797,1356976823738,12562175250,12562175250,12566502514,12565207040,1890362,1256217525000,A);
    insert into data (90927602,1356976813098,1356976814797,1356976823738,12562175250,12562175250,12566502514,12565207040,1890362,1256217525000,A,90927603,1356976813098,1356976814797,1356976823738,12562175250,12562175250,12566502514,12565207040,1890362,1256217525000,A);
    

    【讨论】:

    • 谢谢 Ed,我可以限制每次插入的记录数吗?说每个插入100条记录?有可能吗?
    • 什么是记录? “A”属于哪里?发布一些代表性输入和预期输出,因为当我们回答一个问题然后你说“哦,不,实际上我想做一些不同的事情”时非常令人沮丧,然后我们必须通过阅读 cmets 的迭代来弄清楚那是什么。
    • 恕我直言,Ed,我的问题正文中提到了限制问题,我不想在得到回答后要求额外的内容。感谢您的帮助!
    • 你是对的,你确实在那里提到了 100,但是人们在他们的问题中放了很多不重要的东西,当我(显然还有其他人)阅读你的问题时,这似乎完全不重要,因为你的示例输入和预期输出显示所有输入行进入 1 个输出行 - 样本输入/输出是重要的。如果您想一次获取一些输入行并将它们分组到多个输出行中,请显示,例如使用 10 行输入并将它们分组,例如,一次 3 行,而不是输出中一次 100 行。
    • 是的,你是对的,我很抱歉,你说的是真的,谢谢你的帮助和你的时间。
    【解决方案2】:

    awk:

    $ awk 'BEGIN{printf "%s","insert into date ("}$NF{gsub(/\|/,",");printf "%s",$0}END{print ");"}' file
    insert into date (90927597,1356976813998,1356976814177,1356976817457,17756249959,17756249959,18663111085,17753220005,1090917,1775624995900,A90927599,1356976813098,1356976814797,1356976823738,12562175250,12562175250,12566502514,12565207040,1890362,1256217525000,A);
    

    使用tr的更简洁方式:

    $ echo "insert into date ($(tr -d '\n' < file));" | tr '|' ','
    insert into date (90927597,1356976813998,1356976814177,1356976817457,17756249959,17756249959,18663111085,17753220005,1090917,1775624995900,A90927599,1356976813098,1356976814797,1356976823738,12562175250,12562175250,12566502514,12565207040,1890362,1256217525000,A);
    

    【讨论】:

    • 谢谢,您知道是否有办法将 awk 打印选项限制为每条语句 100 行?
    • print 每条语句打印一行,我不使用 print.. 请澄清您的意思。
    • 现在,使用您的解决方案,我可以创建一个包含数千条记录的巨大单个批量插入语句的大文件。我可以分开吗?成多个批量语句?每个可以说有 100 条记录?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-05
    • 1970-01-01
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多