解決したいこと
Python初学者ですが、学習のために既存プログラムの改修を行いたいと考えております。
行いたい内容は、複数のcsvファイルを読み込み、データを整理した後、一つのファイルに書き出しです。
*ページ下部に現状や問題点など記載しております。
ファイルは下記になります。
商品のマスターデータ →/input/items.csv 商品の売上データ(日毎に別ファイル) →/input/sales_raw_20161030.csv /input/sales_raw_20161101.csv ... /input/sales_raw_20161106.csv 書き出し後の売上データ →/output/sales.csv
商品マスターデータ(items.csv)の中身は下記になります。
商品ID、商品名、商品価格
商品の売上データ(sales_raw_YYYYmmdd.csv)の中身は下記になります。
購入ID、ユーザーID、商品ID、個数、販売日時
書き出し後のデータ(sales.csv)は下記になります。
購入ID、ユーザーID、商品ID、商品名、商品価格、個数、販売日時
*商品の売上データの商品IDと商品マスターデータの商品IDを紐付け、紐付く商品名と商品価格を出力させます。
既存のプログラム
py
1import os 2 3def main(): 4 with open('output/sales.csv', mode='w', encoding='utf-8') as sales_f: 5 for name in os.listdir('input/'): 6 if name.startswith('sales_raw_') and name.endswith('.csv') \ 7 and "201611" in name: 8 with open(os.path.join('input/', name), encoding='utf-8') as f: 9 for row in f: 10 data = row.rstrip().split(',') 11 12 with open('input/items.csv', encoding='utf-8') as items_f: 13 for row in items_f: 14 data2 = row.rstrip().split(',') 15 if data2[0] == data[2]: 16 sales_f.write( 17 ','.join(( 18 data[0], 19 data[1], 20 data[2], 21 data2[1], 22 data2[2], 23 data[3], 24 data[4], 25 )) + '\n' 26 ) 27 28 29if __name__ == "__main__": 30 main()
改修途中のプログラム
py
1import os 2import re 3 4def main(): 5 # 商品マスターデータの読み込み処理 6 items = {} 7 with open('input/items.csv', encoding='utf-8') as f: 8 for row in f: 9 item_id, name, price = row.rstrip().split(',') 10 items[item_id] = { 11 'name': name, 12 'price': price 13 } 14 15 # 売上生データの読み込み処理 16 sales = [] 17 for filename in os.listdir('input/'): 18 if filename.startswith('sales_raw_') and filename.endswith('.csv') \ 19 and "201611" in filename: 20 with open(os.path.join('input/', filename), encoding='utf-8') as f: 21 for row in f: 22 data = row.rstrip().split(',') 23 item_id = data[2] 24 if item_id in items: 25 sales.append({ 26 'purchase_id': data[0], 27 'user_id': data[1], 28 'item_id': data[2], 29 'name': items[item_id]['name'], 30 'price': items[item_id]['price'], 31 'volume': data[3], 32 'sold_at': data[4] 33 }) 34 35 # まとめた売上データを書き出し 36 columns = ['purchase_id', 'user_id', 'item_id', 37 'name', 'price', 'volume', 'sold_at'] 38 with open('output/sales.csv', mode='w', encoding='utf-8') as f: 39 for row in sales: 40 row_str = ','.join(str(row[column]) for column in columns) 41 f.write(row_str + '\n') 42 43if __name__ == "__main__": 44 main()
自分で試したこと
今回行いたい内容としましたは、下記になります。
・複雑な文字列の判定に正規表現を使う
・現状の売上生データを読み込む処理では「売上生データのファイル名はどんな名前か」が分かりにくい。
そこで「売上生データのファイル名」にマッチする正規表現を書くことでプログラムを書いてわかりやすくする
Pythonの正規表現を使用するのが初めてで、正規表現モジュールの使い方など調べてみたのですが、どこのコードで正規表現を使うと良いのかが分からず詰まっている状況になります。
その他に何か必要な情報などありましたら、提示いたします。
長くなってしまい、大変恐縮ではございますが、ご教授頂けますと幸いです。
よろしくお願いいたします。