質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1051閲覧

python テキスト処理

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/12/11 02:21

テキスト処理について質問させていただきます。

以下のlogファイルをCSV形式にしたいのですが、logファイルを読み込んでから、
不要な空白(スペース、タブなど)を削除してみました。

そこから、どの様な処理をしていけば良いのかが検討がつかない状態です。
どなたか、サンプルとなるコードやアドバイスをいただければと思います。

よろしくお願い致します。

python

1file_name = 'C:\work\wlc.log' 2 3with open(file_name, 'r', encoding='shift-jis') as f: 4 lines = f.readlines() 5 6for line in lines: 7 newlines = line.split() 8 9 # split()で分割するち、空のリストも表示されるため、else節で空のリスト以外を抽出(以下のコメント参照) 10 if not newlines: 11 continue 12 else: 13 print(newlines) 14''' 15[] <- if not newlines:でこの様なリストを出さないようにしている 16['Wed', 'Sep', '15', '17:26:27', 'JST', '2021'] 17['MAC', 'Address', 'IP', 'Type', 'APID', 'AP', 'Name', 'L2', 'Mode', 'L3', 'Mode', 'Authenticated', 'User', 'Name', 'Tag/ID', 'RF', 'Band', 'IP', 'Mode', 'Client', 'IP', 'Station', 'Type', 'OS', 'Type']['VLAN', 'Pool', 'Name'] 18['aa:aa:aa:aa:aa:aa', 'Discovered', '244', 'AP1', 'wpa2-psk', 'clear', '0', '802.11bgn2s20', 'IPv4', '192.168.201.175', 'wireless', '370103060f1f212b2c2e2f7779f9fc'] 19[] <- if not newlines:でこの様なリストを出さないようにしている 20''' 21

wlc.log

log

1 2Wed Sep 15 17:26:27 JST 2021 3MAC Address IP Type APID AP Name L2 Mode L3 Mode Authenticated User Name Tag/ID RF Band IP Mode Client IP Station Type OS Type 4 VLAN Pool Name 5 6aa:aa:aa:aa:aa:aa Discovered 244 AP1 wpa2-psk clear 0 802.11bgn2s20 IPv4 192.168.201.175 wireless 370103060f1f212b2c2e2f7779f9fc 7 8bb:bb:bb:bb:bb:bb Discovered 245 AP2 wpa2-psk clear 0 802.11bgn2s20 IPv4 192.168.202.144 wireless 370103060f1f212b2c2e2f7779f9fc 9 10cc:cc:cc:cc:cc:cc Discovered 244 AP3 wpa2-psk clear 0 802.11an IPv4 192.168.203.133 wireless 370103060f1f212b2c2e2f7779f9fc 11 12 13Wed Sep 15 17:27:41 JST 2021 14 15 16MAC Address IP Type APID AP Name L2 Mode L3 Mode Authenticated User Name Tag/ID RF Band IP Mode Client IP Station Type OS Type 17 VLAN Pool Name 18 19aa:aa:aa:aa:aa:aa Discovered 244 AP1 wpa2-psk clear 0 802.11bgn2s20 IPv4 192.168.201.175 wireless 370103060f1f212b2c2e2f7779f9fc 20 21bb:bb:bb:bb:bb:bb Discovered 245 AP2 wpa2-psk clear 0 802.11bgn2s20 IPv4 192.168.202.144 wireless 370103060f1f212b2c2e2f7779f9fc 22 23cc:cc:cc:cc:cc:cc Discovered 244 AP3 wpa2-psk clear 0 802.11an IPv4 192.168.203.133 wireless 370103060f1f212b2c2e2f7779f9fc 24

以下の様なCSVファイルの作成を行いたい。
sample.csv

csv

1Time Stamp,MAC Address,IP Type,APID,AP Name,L2 Mode,L3 Mode,Tag/ID,RF Band,IP Mode,Client IP,Station Type,OS Type 2Wed Sep 15 17:26:27 JST 2021,aa:aa:aa:aa:aa:aa... 3Wed Sep 15 17:26:27 JST 2021,bb:bb:bb:bb:bb:bb... 4Wed Sep 15 17:26:27 JST 2021,cc:cc:cc:cc:cc:cc... 5Wed Sep 15 17:27:41 JST 2021,aa:aa:aa:aa:aa:aa... 6Wed Sep 15 17:27:41 JST 2021,bb:bb:bb:bb:bb:bb... 7Wed Sep 15 17:27:41 JST 2021,cc:cc:cc:cc:cc:cc...

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

Pandas を使ってみました。

python

1import pandas as pd 2import calendar 3 4log_file = 'wlc.log' 5 6header = 'Time Stamp,MAC Address,IP Type,APID,AP Name,L2 Mode,L3 Mode,Tag/ID,RF Band,IP Mode,Client IP,Station Type,OS Type'.split(',') 7weekday = '|'.join(calendar.day_abbr) 8 9df = pd.read_table(log_file, header=None) 10df = df[~df[0].str.match(r'.*(MAC Address|VLAN Pool Name)')] 11df = ( 12 df.groupby(df[0].str.match(rf'^({weekday}) ').cumsum()) 13 .apply(lambda x: 14 pd.DataFrame([[x.iloc[0, 0]] + i for i in x.iloc[1:,0].str.split()])) 15 .reset_index(drop=True)) 16df.columns = header 17 18df.to_csv('sample.csv', index=False)

sample.csv

csv

1Time Stamp,MAC Address,IP Type,APID,AP Name,L2 Mode,L3 Mode,Tag/ID,RF Band,IP Mode,Client IP,Station Type,OS Type 2Wed Sep 15 17:26:27 JST 2021,aa:aa:aa:aa:aa:aa,Discovered,244,AP1,wpa2-psk,clear,0,802.11bgn2s20,IPv4,192.168.201.175,wireless,370103060f1f212b2c2e2f7779f9fc 3Wed Sep 15 17:26:27 JST 2021,bb:bb:bb:bb:bb:bb,Discovered,245,AP2,wpa2-psk,clear,0,802.11bgn2s20,IPv4,192.168.202.144,wireless,370103060f1f212b2c2e2f7779f9fc 4Wed Sep 15 17:26:27 JST 2021,cc:cc:cc:cc:cc:cc,Discovered,244,AP3,wpa2-psk,clear,0,802.11an,IPv4,192.168.203.133,wireless,370103060f1f212b2c2e2f7779f9fc 5Wed Sep 15 17:27:41 JST 2021,aa:aa:aa:aa:aa:aa,Discovered,244,AP1,wpa2-psk,clear,0,802.11bgn2s20,IPv4,192.168.201.175,wireless,370103060f1f212b2c2e2f7779f9fc 6Wed Sep 15 17:27:41 JST 2021,bb:bb:bb:bb:bb:bb,Discovered,245,AP2,wpa2-psk,clear,0,802.11bgn2s20,IPv4,192.168.202.144,wireless,370103060f1f212b2c2e2f7779f9fc 7Wed Sep 15 17:27:41 JST 2021,cc:cc:cc:cc:cc:cc,Discovered,244,AP3,wpa2-psk,clear,0,802.11an,IPv4,192.168.203.133,wireless,370103060f1f212b2c2e2f7779f9fc

投稿2021/12/11 06:52

編集2021/12/11 08:05
melian

総合スコア20655

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

以下のような処理になるかと思います。
1.空白の行はスキップ
2.MAC Addresで始まる行はスキップ
3.先頭が空白のあとVLAN Pool Nameの文字がある行はスキップ(MAC Addresと同じ行ならこれは不要)
4.JST YYYYの形式の文字があればタイムスタンプと解釈(YYYYは4桁の数字)
6.上記外は実データなので、配列に格納
7.上記の配列の先頭にタイムスタンプを追加
8.上記の配列をカンマで連結し、印字

python3

1# coding: shift-jis 2import re 3file_name = 'C:\work\wlc.log' 4 5with open(file_name, 'r', encoding='shift-jis') as f: 6 lines = f.readlines() 7time0 = "" 8for line in lines: 9 line = line.rstrip("\n") #改行を削除 10 if re.search("^\s*$",line): #空白行はスキップ 11 continue 12 if re.search("^MAC Address",line): # MAC Addresで始まる行はスキップ 13 continue 14 if re.search("^\s*VLAN Pool Name",line): # 先頭が空白のあとVLAN Pool Nameの文字がある行はスキップ 15 continue 16 if re.search("JST \d\d\d\d",line): # JST YYYYの形式の文字があればタイムスタンプと解釈 17 time0 = line 18 continue 19 newlines = line.split() 20 newlines.insert(0,time0) #先頭に時刻を追加 21 print(','.join(newlines)) #カンマで連結し印字 22

投稿2021/12/11 04:35

tatsu99

総合スコア5493

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tatsu99

2021/12/11 04:36

見出しの印字が漏れていました。これは、質問者の方のほうで追記してください。
退会済みユーザー

退会済みユーザー

2021/12/11 07:12 編集

分かりやすいプログラム、解説、ありがとうございます。 一つ、質問させていただきたいのですが、rstrip(''\n)を行っておりますが、 print(line)で表示すると、特に、元のlogファイルと相違なく、改行もあるように見えます。 表示としては、変化ないが、しっかりと改行は削除されているということでしょうか? for line in lines: line = line.rstrip("\n") WindowsやLinux等のコマンドの出力結果って、変な空白が多くて、余分な空白を取り除くことに 四苦八苦しております。
tatsu99

2021/12/11 08:26

以下の方法で改行が削除されていることを確認できます。 1.方法1 line = line.rstrip("\n") 上記の行をコメントにして実行し、結果が異なることを確認する。 2.方法2 line = line.rstrip("\n") の次に print("<" + line + ">") を挿入して実行する。 その結果 ① < と > が同じ行に出力されれば改行がlineの中にないことになる。 ② < のつぎの行に > が表示されれば、lineの中に改行があることになる。 実行結果は①になりますが。 line = line.rstrip("\n")をコメントにして実行すると ②の結果になります。
退会済みユーザー

退会済みユーザー

2021/12/12 00:22

分かりやすい説明ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問