だから私は巨大な(100,000を超えるレコード)ログファイルを持っており、日付スタンプに基づいてすべてのGPS位置を抽出する必要があります。
./production.log.109.gz:I, [2022-02-10T10:00:59.703529 #25190] INFO -- : #<Event::TeltonikaServer:3ffcbe931d90>:357544377733734 TS: 2022-02-10 10:00:35 +0000, GPS: 52.1773033,20.8162, SAT: 17, KM/H: 0, V: 26343
./production.log.109.gz:I, [2022-02-10T10:01:13.939349 #25190] INFO -- : #<Event::TeltonikaServer:3ffcbe931d90>:357544377733734 TS: 2022-02-10 10:00:40 +0000, GPS: 52.1773033,20.8162, SAT: 17, KM/H: 0, V: 26352
./production.log.109.gz:I, [2022-02-10T10:10:44.757308 #25190] INFO -- : #<Event::TeltonikaServer:3ffcbe931d90>:357544377733734 TS: 2022-02-10 10:10:40 +0000, GPS: 52.1773033,20.8162, SAT: 18, KM/H: 0, V: 25924
したがって、基本的にこれらの3つのレコードを見つけてカットして新しいファイルに貼り付けるか、10th February 2022
可能であれば適切なファイルに貼り付ける必要があります。"GPS:"
2022-02-10.txt
.KML
答え1
各イベントは別々の行にあるため、1行ずつ読み取って後続のテキストを見つけるregex
ために使用できます。その後、ファイル名として使用して書き込むことができます。TS:
GPS:
TS
append mode
最小限の作業例
私はメモリ内のファイルをシミュレートするio
ためだけにwithを使用しましたが、text
次のものを使用する必要があります。open()
text = '''./production.log.109.gz:I, [2022-02-10T10:00:59.703529 #25190] INFO -- : #<Event::TeltonikaServer:3ffcbe931d90>:357544377733734 TS: 2022-02-10 10:00:35 +0000, GPS: 52.1773033,20.8162, SAT: 17, KM/H: 0, V: 26343
./production.log.109.gz:I, [2022-02-10T10:01:13.939349 #25190] INFO -- : #<Event::TeltonikaServer:3ffcbe931d90>:357544377733734 TS: 2022-02-10 10:00:40 +0000, GPS: 52.1773033,20.8162, SAT: 17, KM/H: 0, V: 26352
./production.log.109.gz:I, [2022-02-10T10:10:44.757308 #25190] INFO -- : #<Event::TeltonikaServer:3ffcbe931d90>:357544377733734 TS: 2022-02-10 10:10:40 +0000, GPS: 52.1773033,20.8162, SAT: 18, KM/H: 0, V: 25924
'''
import io
import re
# open file for reading
#file_in = open("filename.log")
file_in = io.StringIO(text)
# read line by line
for line in file_in:
# find values
ts = re.findall('TS: ([^ ]*) ', line)[0]
gps = re.findall('GPS: ([^ ]*), ', line)[0]
val = gps.split(',')
gps = f'{val[1]},{val[0]}'
print('TS:', ts, '| GPS:', gps)
# open file for writing in `append mode`
with open(f'{ts}.txt', 'a') as file_out:
# write in new line
file_out.write(gps + '\n')
結果:
TS: 2022-02-10 | GPS: 20.8162,52.1773033
TS: 2022-02-10 | GPS: 20.8162,52.1773033
TS: 2022-02-10 | GPS: 20.8162,52.1773033
KML
より複雑な型(XML
構造体を使用)なので作成しません。
しかし、作成する必要があるPythonモジュールがありますKML
。シンプルkml
ファイルに追加する機能がない可能性があるため、まずすべてのGPS値を取得してデータごとにグループ化し、各グループにKMLを作成し、すべてのポイントを一度に保存する必要があります。
編集する:
text = '''./production.log.109.gz:I, [2022-02-10T10:00:59.703529 #25190] INFO -- : #<Event::TeltonikaServer:3ffcbe931d90>:357544377733734 TS: 2022-02-10 10:00:35 +0000, GPS: 52.1773033,20.8162, SAT: 17, KM/H: 0, V: 26343
./production.log.109.gz:I, [2022-02-10T10:01:13.939349 #25190] INFO -- : #<Event::TeltonikaServer:3ffcbe931d90>:357544377733734 TS: 2022-02-10 10:00:40 +0000, GPS: 52.1773033,20.8162, SAT: 17, KM/H: 0, V: 26352
./production.log.109.gz:I, [2022-02-10T10:10:44.757308 #25190] INFO -- : #<Event::TeltonikaServer:3ffcbe931d90>:357544377733734 TS: 2022-02-10 10:10:40 +0000, GPS: 52.1773033,20.8162, SAT: 18, KM/H: 0, V: 25924
'''
import io
import re
import simplekml
#f = open("filename.log")
f = io.StringIO(text)
# -----------------------
groups = {}
for line in f:
ts = re.findall('TS: ([^ ]*) ', line)[0]
gps = re.findall('GPS: ([^ ]*), ', line)[0]
val = gps.split(',')
gps = [val[1],val[0]]
print('TS:', ts, '| GPS:', gps)
if ts not in groups:
groups[ts] = []
groups[ts].append(gps)
#----------------------------------------
for name, values in groups.items():
print('name:', name)
kml = simplekml.Kml()
for gps in values:
kml.newpoint(coords=[gps])
# --- after loop ---
kml.save(f"{name}.kml")
答え2
だから数日間Pythonを学んだ後、コードを完全に変更しました。
オリジナル:
- ファイルdata.logを読む
- GPSとタイムスタンプの抽出
- GPSを連想配列に入れる
- TSに基づいてファイルにリストされている配列(例:TS.txt)
- forループを使用してヘッダーとフッターを追加しました。
そうして私が望む姿に変わりました。みんなの助けに感謝します。