2017-03-29 23 views
2

UbuntuシステムでMySQLを使用して複数のSQLテーブルにロードする複数のフォルダにCSVファイルとしてデータを格納しています。各テーブルおよびファイルは、このスキーマ(ファイルは、idフィールドを持っていない)、次のとおりです。複数のファイルから複数のテーブルにデータを挿入

+ ------ + -------- + -------- + --------- + ---------- + 
| SPO_Id | SPO_Name | SPO_Date | SPO_Price | SPO_Amount | 
+ ------ + -------- + -------- + --------- + ---------- + 

を各ファイルには、一日のために価格設定や売上データが含まれています。残念ながら、ファイル名は日付の後に付けられません。日付の後に名前が付けられたフォルダに格納されます。

use pricing ; # the database I want the tables in 
drop table if exists SP_2017_01_02 ; 

create table SP_2017_01_02 (
    SPO_Id int not null primary key auto_increment, 
    SPO_Name varchar(32), 
    SPO_Date date, 
    SPO_Price float, 
    SPO_Amount int 
); 

load data local infile '/Exmpl/20170102/prices.csv' 
    into table SP_2017_01_02 
    fields terminated by ',' 
    lines terminated by '\n' 
    ignore 1 lines # First line contains field name information 
    (SPO_Name, SPO_Date, SPO_Price, SPO_Amount) ; 

select * from SP_2017_01_02 ; 

show tables ; 

このクエリは、のために正常に動作します:ここではディレクトリはここ

 ------> 20170102 ------> prices.csv 
    /
    /
Exmpl ------> 20170213 ------> prices.csv 
    \ 
    \ 
     ------> 20170308 ------> prices.csv 

どのように見えるかの例図は、テーブルにファイルを格納してからデータを引き出し、私が書いたクエリされます一度に1つのテーブルを読み込む。しかし、私は何百ものテーブルを持っているので、このプロセスを自動化する必要があります。私はそれを見て、ここで私が見つけたいくつかの事があります:

Here質問はSQL Serverを参照してください。その答えは、実際の物質なしに何をすべきかの示唆を与える。

This questionは、これだけは、特に私がアクセスを持っていないためにどの、SSISを使用している、また、鉱山と非常によく似ている(と質問が未解決のままである)

This postは、制御ファイルの参照を使用して提案するが、これはのためにありますsql-loaderとoracleです。

Using pythonがこれまでに使用したことはないかもしれません。私の質問はあまりにも複雑な問題のように思えます。

This oneおよびthis oneもpythonを使用しますが、1つのファイルのデータで1つのテーブルを更新するだけです。

私はSQL Serverで多くの作業をしましたが、私はかなり新しいMySQLです。どんな助けでも大歓迎です!

更新

私は、MySQLでこの使用した動的SQLを行うことを試みてきました。残念ながら、MySQLではストアドプロシージャを使用して動的SQLを実行する必要がありますが、関数はストアドプロシージャ内にデータをロードできません。 @RandomSeedとしてpointed outthis cannot be doneとMySQLのみ。私は彼の助言を取り、これを処理するシェル/ pythonスクリプトを書くつもりです。

私は(または他の誰かが)確かな答えを出すまでこの質問を開いたままにします。

答えて

1

だから、あなたがするように見える単一のテーブルを読み込む(またはPythonで同等のものを幾分簡単に構築できる)SQLクエリ/関数/スクリプトがあれば、pythonを使用してディレクトリ構造をループしてファイル名はかなりシンプルです。何とか毎回新しいcsvパラメータをinfile '/Exmpl/20170102/prices.csv'に渡して、Python内からSQLスクリプトを呼び出すことができれば、いいはずです。

今はあまり時間がありませんが、私はあなたがどのようにそれらのファイル名の文字列をpythonで得ることができるかを見せたいと思います。

import os 

prices_csvs = [] 
for root, dirs, files in os.walk(os.path.join('insert_path_here', 'Exmpl'): 
    for f in files: 
     if f == 'prices.csv': 
      prices_csvs.append(os.path.join(root, f)) 
      break # optional, use if there only is one prices.csv in each subfolder 

for csv_file in prices_csvs: 
    # csv_file is a string of the path for each prices.csv 
    # if you can insert it as the `infile` parameter and run the sql, you are done 
    # admittedly, i don't know how to do this at the moment 

os.walkそこに格納されているfilesとしてdirsやファイルなどのすべてのディレクトリを列挙し、そのフォルダへのパスに名前rootを与え、各サブディレクトリを通じてダウンしました。そこから、ファイル名があなたが探しているものと一致するかどうかを確認し、そうであればリストに格納する単純なチェックです。リストをループするとExmplの各prices.csvへのパスを含む文字列が得られます。 Pythonは、彼は完全に質問に答えていないが、彼は私に素晴らしいスタートを与えた、ので、私は正しい答えのようにチャーリーの答えをマークした

+0

ありがとうございます。上記の私のアップデートに従って、私はこれをシェルスクリプトかPythonスクリプトのどちらかで試してみるつもりです。これは私を起動させるものかもしれません。 – KindaTechy

+1

シェルスクリプトを使用している場合は、シェルに値を返すためのPython関数を取得する方法については、次を参照してください。http://stackoverflow.com/questions/2115615/assigning-value-to-shell-variable-using-a -function-return-value-from-python http://stackoverflow.com/questions/26162394/convert-a-python-data-list-to-a-bash-array – Charlie

+0

もしあなたがPythonを使っているなら、あなたはSQLのもののために使用する? – Charlie

1

を助けることができる方法についての非常に小さな光を当てる

希望。以下は、csvファイルをMySQLにロードする方法を知りたい人のためのコードです。基本的な考え方は、Pythonで文字列を動的に構築し、その文字列をMySQLで実行することです。

#!/usr/bin/python 
import os 
import MySQLdb # Use this module in order to interact with SQL 

# Find all the file names located in this directory 
prices_csvs = [] 
for root, dirs, files in os.walk(os.path.join('insert_path_here', 'Exmpl'): 
for f in files: 
    if f == 'prices.csv': 
     prices_csvs.append(os.path.join(root, f)) 
     break 

# Connect to the MySQL database 
db = MySQLdb.connect(host ="<Enter Host Here>", user = "<Enter User here>", passwd = "<Enter Password Here>", db = "<Enter Database name here>") 

# must create cursor object 
cur = db.cursor() 

for csv_file in prices_csvs: 

    directory = "'" + csv_file + "'"  

    table = csv_file[56:64] # This extracts the name of the table from the directory 

    sql_string1 = "drop table if exists SD" + table + " ;\n" 

    sql_string2 = "create table SD" + table + " as \n\ 
    <Enter your fields here> \n\ 
    ); \n" 

    sql_string3 = "load data local infile " + directory + " \n\ 
    into table TempPrices \n\ 
    fields terminated by ',' \n\ 
    lines terminated by " + repr('\n') + " \n\ 
    ignore 1 lines ;\n" 

    # Print out the strings for debugging 
    print sql_string1 
    print sql_string2 
    print sql_string3 
    print sql_string4 
    print sql_string5 

    # Execute your SQL statements 
    cur.execute(sql_string1) 
    cur.execute(sql_string2) 
    cur.execute(sql_string3) 
    cur.execute(sql_string4) 
    cur.execute(sql_string5) 
    db.commit() 

db.close() 

デバッグ中に、印刷されたSQL文をコピーしてMySQLに貼り付けて、文字列が正常に構築されていることを確認することが非常に役立ちました。

関連する問題