閲覧いただきありがとうございます。
python3でファイルサイズの大きいデータを取り込んで理想とする行列に成形したいです。
容量の大きいデータを取り込むにはpandasが処理早いとの文献を読んだので、pandasを用いました。
やりたいことは、アパッチログ+独自項目があるtxtファイルを取り込んで、
・独自項目をパース
・パースされた項目に値があった場合はアパッチログ行+パースされた項目の行を追加
したいです。
###データイメージ(初期データ)
index 項目名1 項目名2
0 アパッチログA AAA|XXX|YYY
1 アパッチログB BBB||
2 アパッチログC CCC||ZZZ
###独自項目をパース
index 項目名1 項目名2 項目名3 項目名4
0 アパッチログA AAA XXX YYY
1 アパッチログB BBB NaN NaN
2 アパッチログC CCC NaN ZZZ
###パースされた場合は、アパッチログ行+パースされた項目の行を追加
index 項目名1 項目名2 項目名3 項目名4
0 アパッチログA AAA NaN NaN
1 アパッチログA XXX NaN NaN
2 アパッチログA YYY NaN NaN
3 アパッチログB BBB NaN NaN
4 アパッチログC CCC NaN NaN
5 アパッチログC ZZZ NaN NaN
実際のデータ件数は数万件ある想定です。
1件ずつチェックしてレコード追加すると処理時間がかかる、初めてpandasを使ったので
y軸に対して、項目3、項目4に値があったら、ログを複製する・・・みたいなことが
できるのではないかと調べていたのですが、わかりませんでした。
###試したこと
大したことしてないですが・・・・
def log_parser():
test_file = 'C:\akamai_data/ftp_log/alds0001/tmp/sample_apache_log.txt'
reader = pd.read_csv(test_file, sep='\n', chunksize=50,header=None) for row in reader: regex = '([(\d.)]+) - - [(.*?)] "(\S+?)(?: +(.*?) +(\S*?))?" (\d+) (\d+) "(.*?)" "(.*?)" "(.*?)" "(.*?)"'
アパッチログをパースする
pd_result=row[0].str.extract(regex, expand=True)
結果の確認
print(pd_result.at[0,0])
print(pd_result.at[0,1])
print(pd_result.at[0,2])
print(pd_result.at[0,3])
print(pd_result.at[0,4])
print(pd_result.at[0,5])
print(pd_result.at[0,6])
print(pd_result.at[0,7])
print(pd_result.at[0,8])
print(pd_result.at[0,9])
print(pd_result.at[0,10]) ※独自項目が入ってる
変換用エリア pd_result[11] = pd_result[10] todo pd_result[11]をパースする todo パースされて値があった場合はアパッチログを複製して行追加
###補足情報(言語/FW/ツール等のバージョンなど) 開発言語 python 3.6.8 開発環境 Eclipse 2020-03(4.15)
回答1件
あなたの回答
tips
プレビュー