1.はじめに
本日は、実務でのテキスト加工について書きます。
実務でログを取得し、集計を行うことになり取得したログを、集計可能な形式(CSV形式)にしなければ
ならなくなりました。
出力されたログ(r_file.log)を見ると、日時が一番上に書かれており、各メッセージの一番左にありません。
集計するためには、日時を、各メッセージの一番左に追記したCSV形式(w_file.csv)にする必要がありました。
さらに、取得したログ(r_file.log)は、200万行ある状態でした。
r_file.log
Tue Nov 11 00:00:00 JST 2022
12 aaa bbb cc:cc:cc:cc ddd
34 eee fff gg:gg:gg:gg hhh
Tue Nov 11 00:00:05 JST 2022
78 iii jjj kk:kk:kk:kk lll
99 mmm nnn oo:oo:oo:oo ppp
Tue Nov 11 00:00:10 JST 2022
12 qqq rrr ss:ss:ss:ss ttt
34 uuu vvv ww:ww:ww:ww zzz
w_file.csv
Tue,Nov,11,00:00:00,12,aaa,bbb,cc:cc:cc:cc,ddd
Tue,Nov,11,00:00:00,34,eee,fff,gg:gg:gg:gg,hhh
Tue,Nov,11,00:00:05,78,iii,jjj,kk:kk:kk:kk,lll
Tue,Nov,11,00:00:05,99,mmm,nnn,oo:oo:oo:oo,ppp
Tue,Nov,11,00:00:10,12,qqq,rrr,ss:ss:ss:ss,ttt
Tue,Nov,11,00:00:10,34,uuu,vvv,ww:ww:ww:ww,zzz
2.作成したコード
取得したログ(r_file.log)が、200万行ということもあり、一気に読み込み/出力(書き込み)は
メモリの消費が大きいと思い、1行ずつ処理を行いました。
プログラミング入門者が、実務で書いたコードを掲載します。
sample_01.py
import csv
read_file = "r_file.log"
write_file = "w_file.csv"
with open(write_file, "w", encoding="utf_8", newline="") as w:
writer = csv.writer(w)
with open(read_file, "r", encoding="utf_8") as f:
line = f.readline()
while line:
if line.startswith("Tue"):
# JST 2022を除去
data = line.split()[:4]
# 列の開始が数字か確認
if line[0] >= '0' and line[0] <= '9':
elem = line.split()
# 年月と時間を一番左に追記するため以下の処理を実施
csv_data = data + elem
writer.writerow(csv_data)
line = f.readline()
3.コードについて
今回のコードは、まだまだ初心者レベルのため、突っ込みどころ満載だと思います。
今後、スキルアップのため、以下を取り入れて書き換えを行います。
- CSVモジュール又は、pandasを使うこと。
- 日時の抽出は、正規表現を使うこと。
4. 最後に
- ツッコミ歓迎致します。皆様のツッコミが、私のスキルアップにつながります!!
- お題なんかも出していただけると助かります。
- 実務では、もっと、こういう使い方もあるよ!!みたいなアドバイスもいただけると嬉しいです。