見出し画像

Pythonでテキストの抽出をしてみる整形編-CSVファイルの作成まで

前回で全てのテキストを抽出しました。抽出したテキストを見てみます。

整理番号:322636940
日付:令和2年4月15日
平成 30年5月 2日
提出人544506015206
参考人青しそ大葉
提出日   昭和16年 2月 29日
提出番号PYT/MQL4827/793784
通知番号通知256488

テキストの抽出はできたのですがこのままCSVは難しそうです。整形しないといけないです。

CSVにするルール

整理番号:322636940→整理番号,322636940とカンマ区切りでしたいと思います。理想は以下のようになります。

整理番号,322636940
日付,令和2年4月15日
平成,30年5月 2日
提出人,544506015206
参考人,青しそ大葉様
提出日,昭和16年 2月 29日
提出番号,PYT/MQL4827/793784
通知番号,通知256488

このようにできたらよいなと思ってます。参考人は元々様が着いていたのですが、抽出というよりは追加したいなと思いました。

どうやるか?

通知番号などのテキストを連結させているのは、比較的やりやすいと思います。提出番号と通知番号を例にやってみます。

ソースコード

#提出番号+通知番号
 results = re.findall(r"提出番号[\s\S]+[a-zA-Za-zA-Z]*[0-9 0-9]", str_areas)
 with open("sample_python_txt.txt",'a',newline='') as f:
     for result in results:
         result = result.split()
         print(result[0]+result[2])
         print(result[1]+result[3])
         f.write(result[0]+result[2] + '\n')
         f.write(result[1]+result[3] + '\n')

こうなっているのを少し変えます

#提出番号+通知番号
 results = re.findall(r"提出番号[\s\S]+[a-zA-Za-zA-Z]*[0-9 0-9]", str_areas)
 with open("sample_python_txt.txt",'a',newline='') as f:
     for result in results:
         result = result.split()
         print(result[0]+ ":" +result[2])
         print(result[1]+ ":" +result[3])
         f.write(result[0]+ ":" +result[2] + '\n')
         f.write(result[1]+ ":" +result[3] + '\n')

このようにしました。連結させているとこに「:」を追加しました。出力結果は以下のようになります。

整理番号:322636940
日付:令和2年4月15日
平成 30年5月 2日
提出人544506015206
参考人青しそ大葉
提出日   昭和16年 2月 29日
提出番号:PYT/MQL4827/793784
通知番号:通知256488

:が追加されています。提出人と参考人もこの方法で可能です。整理番号、日付、提出日はできません。

提出日のコード

#提出日を取得
 results = re.findall(r"提出日[\s\S]+[明治|大正|昭和|平成|令和][\s\S][0-9 0-9]+年[\s\S][0-9 0-9]月[0-9 0-9]+日", str_areas)
 with open("sample_python_txt.txt",'a',newline='') as f:
     for result in results:
         #result = result.split()
         print(result)
         f.write(result + '\n')

残念ながら提出日は文字列連結していないため、できません。なのでこれも文字列連結に変えていきたいと思います。

余計な空白を削除

提出日は余計な空白ががあります。そこでコードを変更してまずは余計な空白を消します。

#提出日を取得
 results = re.findall(r"提出日[\s\S]+[明治|大正|昭和|平成|令和][\s\S][0-9 0-9]+年[\s\S][0-9 0-9]月[0-9 0-9]+日", str_areas)
 with open("sample_python_txt.txt",'a',newline='') as f:
     for result in results:
         #result = result.split()
         result = result.replace(' ', '')
         print(result)
         #f.write(result + '\n')

result = result.replace(' ', '')を追加しました。全角スペースを置換しております。これを実行すると

整理番号:322636940
日付:令和2年4月15日
平成 30年5月 2日
提出人544506015206
参考人青しそ大葉
提出日昭和16年2月 29日
提出番号:PYT/MQL4827/793784
通知番号:通知256488

となります。提出日のスペースが消えました。「:」を足してみたいと思います

文字列連結

やり方は複数あると思いますが、文字列をスライスして連結するやり方があります。提出日の文字列のインデックスは0-2となります

提 出 日
0 1 2

このようになります。

方法1

#提出日を取得
 results = re.findall(r"提出日[\s\S]+[明治|大正|昭和|平成|令和][\s\S][0-9 0-9]+年[\s\S][0-9 0-9]月[0-9 0-9]+日", str_areas)
 with open("sample_python_txt.txt",'a',newline='') as f:
     for result in results:
         #result = result.split()
         result = result.replace(' ', '')
         print(result[0:2] + result[3:])
         #f.write(result + '\n')

のように、全て抽出する方法になります。[3:]というのは、文字列の3つめから開始をして終了を省略した形になります。

方法2

#提出日を取得
 results = re.findall(r"提出日[\s\S]+[明治|大正|昭和|平成|令和][\s\S][0-9 0-9]+年[\s\S][0-9 0-9]月[0-9 0-9]+日", str_areas)
 with open("sample_python_txt.txt",'a',newline='') as f:
     for result in results:
         #result = result.split()
         result = result.replace(' ', '')
         print("提出日"+result[3:])
         #f.write(result + '\n')

こっちは、「提出日」というのを文字列として出力して3番目から開始するというのになります。

どっちでやるのがいいのか?

どっちでもいいというのが本音ですが、プログラムを作るときの今後の可能性などを考慮してきめればと思います。

今回は方法1でやっていきます。

:を入れる

「:」をいれます。

#提出日を取得
 results = re.findall(r"提出日[\s\S]+[明治|大正|昭和|平成|令和][\s\S][0-9 0-9]+年[\s\S][0-9 0-9]月[0-9 0-9]+日", str_areas)
 with open("sample_python_txt.txt",'a',newline='') as f:
     for result in results:
         #result = result.split()
         result = result.replace(' ', '')
         print(result[0:2]+ ":" +result[3:])
         #f.write(result + '\n')

「:」を入れてみました。表示してみます。

整理番号:322636940
日付:令和2年4月15日
平成 30年5月 2日
提出人544506015206
参考人青しそ大葉
提出:昭和16年2月 29日
提出番号:PYT/MQL4827/793784
通知番号:通知256488

なぜだ・・・「日」が消えている・・・調べてみました。スライスを使って文字列の指定範囲の部分文字列を取得するのページを見てみました。
ページを見てみると

範囲を指定する方法ですが、範囲の最初の文字のインデックスを開始インデックスに指定し、範囲の最後の文字のインデックスに +1 した値を終了インデックスとして指定します。

とあります。なるほど、そうなると正しくはこうなります。

#提出日を取得
 results = re.findall(r"提出日[\s\S]+[明治|大正|昭和|平成|令和][\s\S][0-9 0-9]+年[\s\S][0-9 0-9]月[0-9 0-9]+日", str_areas)
 with open("sample_python_txt.txt",'a',newline='') as f:
     for result in results:
         #result = result.split()
         result = result.replace(' ', '')
         print(result[0:3]+ ":" +result[3:])
         #f.write(result + '\n')

実行してみます。

整理番号:322636940
日付:令和2年4月15日
平成 30年5月 2日
提出人544506015206
参考人青しそ大葉
提出日:昭和16年2月 29日
提出番号:PYT/MQL4827/793784
通知番号:通知256488

提出日も無事にできました。

テキストデータに書き込む

#提出日を取得
 results = re.findall(r"提出日[\s\S]+[明治|大正|昭和|平成|令和][\s\S][0-9 0-9]+年[\s\S][0-9 0-9]月[0-9 0-9]+日", str_areas)
 with open("sample_python_txt.txt",'a',newline='') as f:
     for result in results:
         #result = result.split()
         result = result.replace(' ', '')
         print(result[0:3]+ ":" +result[3:])
         f.write(result[0:3]+ ":" +result[3:] + '\n')

テキストデータに書き込みをしました。

提出人と参考人

提出人と参考人のコードも変更します。

#提出人と参考人を取得
 results = re.findall(r"提出人[\s\S]+[0-9]+", str_areas)
 with open("sample_python_txt.txt",'a',newline='') as f:
     for result in results:
         result = result.split()
         print(result[0] + ":"+ result[1])
         print(result[2] +":"+ result[3] + result[4] + "様")
         f.write(result[0]+ ":"+ result[1] + '\n')
         f.write(result[2]+ ":"+ result[3] + result[4] + "様" + '\n')

参考人には様をいれたいので、ここは文字列の抽出して連結ではなく足すことにしました。

整理番号:322636940
日付:令和2年4月15日
平成 30年5月 2日
提出人:544506015206
参考人:青しそ大葉様
提出日:昭和16年2月 29日
提出番号:PYT/MQL4827/793784
通知番号:通知256488

実行してみました。提出人から下は全て半角の「:」となりました。整理番号とかもやっていきます。

平成

平成の箇所のコードを修正します。

#平成を取得
 results = re.findall(r"[明治|大正|昭和|平成|令和]+[\s]+[0-9]+年[0-9]月+[\s]+[0-9]+日", str_areas)
 with open("sample_python_txt.txt",'a',newline='') as f:
     for result in results:
         result = result.replace(' ', '')
         print(result[:2] + ":" + result[2:])
         f.write(result[:2] + ":" + result[2:] + '\n')

スペースがあったのでスペースをまず削除しております。それがresult = result.replace(' ', '')となります。

後は他と同じように「:」をいれます。

整理番号:322636940
日付:令和2年4月15日
平成:30年5月 2日
提出人:544506015206
参考人:青しそ大葉様
提出日:昭和16年2月 29日
提出番号:PYT/MQL4827/793784
通知番号:通知256488

実行すると平成も「:」になりました。

日付と整理番号をやる

  results = re.findall(r"整理番号:\d*", str_areas)
 with open("sample_python_txt.txt",'a',newline='') as f:
     for result in results:
         #result = result.split()
         print(result[:4] + ":" + result[5:])
         f.write(result[:4] + ":" + result[5:] + '\n')

#令和の日付
 results = re.findall(r"日付:[明治|大正|昭和|平成|令和]+\d+年\d月\d+日", str_areas)
 with open("sample_python_txt.txt",'a',newline='') as f:
     for result in results:
         #result = result.split()
         print(result[:2] + ":" + result[3:])
         f.write(result[:2] + ":" + result[3:] + '\n')

コードを変更しました。実行してみます

整理番号:322636940
日付:令和2年4月15日
平成:30年5月 2日
提出人:544506015206
参考人:青しそ大葉様
提出日:昭和16年2月 29日
提出番号:PYT/MQL4827/793784
通知番号:通知256488

無事に全部「:」になりました次回はこのデータを使ってCSVにしたいと思います。

お役に立ちましたか?

投げ銭をいただけるともっと頑張れます!
・note
・仮想通貨(bitflyer)
キャッシュ
のどれでも構いません
ビットコインアドレスは以下になります
3LHnADwZwUbic2L45EnVJEykiG6KfbqrwS

この記事が気に入ったらサポートをしてみませんか?