【问题标题】:Loading multiple csv files to MariaDB/MySQL through bash script通过 bash 脚本将多个 csv 文件加载到 MariaDB/MySQL
【发布时间】:2019-01-05 09:33:08
【问题描述】:

尝试了一整天后,我希望这里有人可以帮助我完成以下脚本的工作。我已经结合了来自多个线程 (example) 和网站的信息,但无法使其正常工作。


我想要做什么:

我正在尝试在我的 Synology NAS 上获取名为“stock_db”的 MariaDB10 数据库,以从特定文件夹(我保存下载的股票历史价格的位置)加载所有 *.csv 文件,并将这些文件添加到名为“价格”的表中'。这些文件都被同样命名为“price_history_'isin'.csv”。 下面的 SQL 语句在我的 Windows 机器上从 HeidiSQL 单独运行时有效:

工作 SQL

LOAD DATA LOW_PRIORITY LOCAL INFILE 'D:\\Downloads\\price_history_NL0010366407.csv'
IGNORE INTO TABLE `stock_db`.`prices`
CHARACTER SET utf8
FIELDS TERMINATED BY ';'
            OPTIONALLY ENCLOSED BY '"'
            ESCAPED BY '"'
            LINES TERMINATED BY '\r\n'
            IGNORE 2 LINES
(@vdate, @vprice)
SET
    isin = 'NL0010366407',
    date = STR_TO_DATE(@vdate, '%d-%m-%Y'),
    price = @vprice
;

问题

不幸的是,当我尝试通过下面的脚本从我的 NAS 上的一个文件夹中批量加载所有 csv 文件时,我一直收到同样的错误。

#!/bin/bash

for filename in ./price_history/*.csv; do
echo $filename
isin=${filename:30:12}
echo $isin
/volume1/@appstore/MariaDB10/usr/local/mariadb10/bin/mysql -u root -p \
    "LOAD DATA LOW_PRIORITY LOCAL INFILE '$filename'\
    IGNORE INTO TABLE 'stock_db.prices'\
        CHARACTER SET utf8\
        FIELDS TERMINATED BY ';'\
        OPTIONALLY ENCLOSED BY '"'"'"'\
        ESCAPED BY '"'"'"'\
        LINES TERMINATED BY '\r\n'\
        IGNORE 2 LINES (@vdate, @vprice)\
    SET\
        isin = '$isin',\
        date = STR_TO_DATE(@vdate, '%d-%m-%Y'),\
        price = @vprice;"
done

ERROR 1102 (42000):数据库名称不正确


我尝试过的

  • 从 stock_db.prices 中取出数据库名称,并在引用的 SQL 语句之外将其作为 [database] 单独提及 - 不起作用
  • 以多种不同方式更改了“stock_db.prices”周围的引号 - 不起作用
  • 将 SQL 分离到一个单独的文件中并引用它“
  • 考虑(甚至首选)使用 PREPARE 语句,但似乎我不能将它与 LOAD DATA 结合使用 (reference)

奖金问题

如果有人可以帮助我做到这一点而无需重新输入用户密码或将密码放入脚本中,这将是非常好的奖励!


更新

通过添加“-e”选项解决了“不正确的数据库错误” 现在我在 csv 文件上有一个新错误:

错误 13“权限被拒绝”

虽然每个人都可以完全访问文件夹和文件。 有人对此有任何想法吗? 非常感谢!

【问题讨论】:

    标签: mysql shell csv mariadb


    【解决方案1】:
    1. 尝试使用 -D 选项设置数据库:将第一行更改为 /volume1/@appstore/MariaDB10/usr/local/mariadb10/bin/mysql -D stock_db -u root -p \ ...

    2. IGNORE INTO TABLE 'stock_db.prices'\ 这一行可能有错误 - 尝试删除单引号。

    3. 在用户的主目录中创建文件 .my.cnf 并将以下信息放入其中: [client] password="my password" Info about option files.

    【讨论】:

    • 感谢您的努力,但我仍然遇到同样的错误。我会进一步调查这些选项文件...谢谢!
    【解决方案2】:
    'stock_db.prices'
    

    引用不正确。这将起作用,因为关键字都不是:

    stock_db.prices
    

    这也可以:

    `stock_db`.`prices`
    

    请注意,数据库名和表名是分开引用的,使用反引号。

    我无法预测这场噩梦会发生什么:

    '"'"'"'
    

    【讨论】:

      猜你喜欢
      • 2013-01-17
      • 2022-01-20
      • 2014-11-23
      • 1970-01-01
      • 2021-06-04
      • 1970-01-01
      • 1970-01-01
      • 2011-07-02
      • 2023-04-01
      相关资源
      最近更新 更多