通过bash脚本将多个csv文件加载到MariaDB / MySQL

时间:2019-01-05 09:33:08

标签: mysql shell csv mariadb

尝试了一整天之后,我希望这里的人可以帮助我完成下面的脚本工作。我已经合并了来自多个线程(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
  

错误1102(42000):数据库名称错误


我尝试过的

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

奖金问题

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


更新

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

  

错误13“权限被拒绝”

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

2 个答案:

答案 0 :(得分:0)

  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.

答案 1 :(得分:0)

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
     base.OnModelCreating(modelBuilder);

     modelBuilder.ApplyConfiguration(new StudentConfigurations());
}

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

MainActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
loadFragment(new HomeFragment());

    BottomNavigationView navigation = findViewById(R.id.navigation);
    navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
}

TranslatorFragment.java
public class TranslatorFragment extends Fragment {

public Button speakButton;

public TranslatorFragment(){
    //Empty Constructor
}

@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    return inflater.inflate(R.layout.translator_fragment, container, false);
}

public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

     //Text to Speech
    tts = new TextToSpeech(getActivity(), this);

    speakButton = findViewById(R.id.speakButton);

    speechText = findViewById(R.id.speechText);

    speakButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            speakOut();
        }
    });
    // End
}
void speakOut(){
}

这也将起作用:

'stock_db.prices'

请注意,数据库名称和表名称使用反斜线分开引用。

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

stock_db.prices