私は WAMP を使用していくつかの csv ログを取り込みましたが、実行する必要がある日常的なアクションのいくつかをスクリプト化することで、より自動化されたプロセスに移行したいと考えていました。
PHPmyadmin で CSV の直接インポート機能を使用して、CSV の方言と詳細を処理していました。
ログ ファイルを解析する MySQLdb を使用して、Python でアップローダーを作成しましたが、ログには役に立たない文字が含まれているため、入力をサニタイズする必要がないと思われる場所で、多くの操作を実行する必要があることがわかりました.. .
たとえば、ログはディレクトリ スキャナーからのデータであり、人々が使用するフォルダーの命名規則を制御することはできません。私はこのフォルダを持っています:-
"C:\user\NZ Business Roundtable_Download_13Feb2013, 400 Access"
charは新しいフィールドマーカーとして読み取られて,
います(結局csvです)。私が実際にやりたいことは、引用符内のすべてのテキストを無視することです:-"......"
'
chars にも同様の問題が見られますが、さらに多くの問題があると確信しています。
私はこれを見つけました:- http://www.tech-recipes.com/rx/2345/import_csv_file_directly_into_mysql/これは、Pythonをスクリプト化してPHPmyadminロードルーチンのように機能させる方法を示しています。主にこのスニペットを使用します:
load data local infile 'uniq.csv' into table tblUniq fields terminated by ','
enclosed by '"'
lines terminated by '\n'
(uniqName, uniqCity, uniqComments)
ただし、すでにスクリプト化されていることを保護したいテーブルへのいくつかの詳細な処理と変更があるため""
、テキストのカプセル化として使用したいことを MySQL に「伝える」方法があるかどうか疑問に思いました。保護したい主な処理は、新しいテーブルを作成するときに特定のテーブル名を付け、残りの処理全体でそれを使用することです。
私のテーブルメーカースクリプトの例:-
def make_table(self):
query ="DROP TABLE IF EXISTS `atl`.`{}`".format(self.table)
self.cur.execute(query)
query = "CREATE TABLE IF NOT EXISTS `atl`.`{}` (`PK` INT NOT NULL AUTO_INCREMENT PRIMARY KEY, `ID` varchar(10), `PARENT_ID` varchar(10), `URI` varchar(284), \
`FILE_PATH` varchar(230), `NAME` varchar(125), `METHOD` varchar(9), `STATUS` varchar(4), `SIZE` varchar(9), \
`TYPE` varchar(9), `EXT` varchar(11), `LAST_MODIFIED` varchar(19), `EXTENSION_MISMATCH` varchar(20), `MD5_HASH` varchar(32), \
`FORMAT_COUNT` varchar(2), `PUID` varchar(9), `MIME_TYPE` varchar(71), `FORMAT_NAME` varchar(59), `FORMAT_VERSION` varchar(7), \
`delete_flag` tinyint, `delete_reason` VARCHAR(80), `move_flag` TINYINT, `move_reason` VARCHAR(80), \
`ext_change_flag` TINYINT, `ext_change_reason` VARCHAR(80), `ext_change_value` VARCHAR(4), `fname_change_flag` TINYINT, `fname_change_reason` VARCHAR(80),\
`fname_change_value` VARCHAR(80))".format(self.table)
self.cur.execute(query)
self.mydb.commit()
私の取り込みスクリプトの例:-
def ingest_row(self, row):
query = "insert"
# Prepare SQL query to INSERT a record into the database.
query = "INSERT INTO `atl`.`{0}` (`ID`, `PARENT_ID`, `URI`, `FILE_PATH`, `NAME`, `METHOD`, `STATUS`, `SIZE`, `TYPE`, `EXT`, \
`EXTENSION_MISMATCH`, `LAST_MODIFIED`, `MD5_HASH`, `FORMAT_COUNT`, `PUID`, `MIME_TYPE`, `FORMAT_NAME`, `FORMAT_VERSION`) \
VALUES ('{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}','{10}','{11}','{12}','{13}','{14}','{15}','{16}','{17}','{18}')".format(self.table, row[0], row[1], row[2], row[3], row[4], \
row[5], row[6], row[7], row[8], row[9], row[10], row[11], row[12], row[13], row[14], row[15], row[16], row[17])
try:
self.cur.execute(query)
self.mydb.commit()
except:
print query
quit()
ログの例: -
"ID","PARENT_ID","URI","FILE_PATH","NAME","METHOD","STATUS","SIZE","TYPE","EXT","LAST_MODIFIED","EXTENSION_MISMATCH","MD5_HASH","FORMAT_COUNT","PUID","MIME_TYPE","FORMAT_NAME","FORMAT_VERSION"
"1","","file:/C:/jay/NZ%20Business%20Roundtable_Download_13Feb2013,%20400%20Access/","C:\jay\NZ Business Roundtable_Download_13Feb2013, 400 Access","NZ Business Roundtable_Download_13Feb2013, 400 Access",,"Done","","Folder",,"2013-06-28T11:31:36","false",,"",,"","",""
"2","1","file:/C:/jay/NZ%20Business%20Roundtable_Download_13Feb2013,%20400%20Access/1993/","C:\jay\NZ Business Roundtable_Download_13Feb2013, 400 Access\1993","1993",,"Done","","Folder",,"2013-06-28T11:31:36","false",,"",,"","",""