使用 pandas 将日志文件转换为 csv
Transform a log file to csv using pandas
我正在尝试转换如下所示的日志文件
Name: AGV
Version: 1.0.00
Revision: 0000000000
Build date: 2000-00-00 00:00:00
Continuation of previous file
[1639992888.497] [B62FF420] [DEBUG Wings.cpp:222] Current sidewing pressure: 3410
[1639992888.497] [B62FF420] [DEBUG Wings.cpp:222] Current sidewing pressure: 4206
[1639992888.517] [B62FF420] [DEBUG Wings.cpp:222] Current sidewing pressure: 3433
[1639992888.517] [B62FF420] [DEBUG Wings.cpp:222] Current sidewing pressure: 4229
[1639992888.527] [B62FF420] [INFO Position.cpp:438] <AGVPOS> 602, 7787.496,
到 csv 文件。
我尝试删除不需要的前几行并手动为列添加名称,然后这样做,这个
df = pd.read_fwf('data.log')
df.to_csv('data.csv', index=None)
这适用于第一个日志文件,但不适用于其他文件,因为我为每个文件都获得了一些额外的列。
我想要得到的输出是这样的
Timestamp. Code. Message
[1639992888.497] [B62FF420] [DEBUG Wings.cpp:222] Current sidewing pressure: 3410
[1639992888.497] [B62FF420] [DEBUG Wings.cpp:222] Current sidewing pressure: 4206
[1639992888.517] [B62FF420] [DEBUG Wings.cpp:222] Current sidewing pressure: 3433
[1639992888.517] [B62FF420] [DEBUG Wings.cpp:222] Current sidewing pressure: 4229
[1639992888.527] [B62FF420] [INFO Position.cpp:438] <AGVPOS> 602, 7787.496,
我的方法肯定不是最有效的,有没有其他方法可以做到这一点?
谢谢。
根据您的评论,这是最好的方法(之后您必须清理数据,但它会起作用)
import pandas as pd
df = pd.read_csv('test_fwf.log', skiprows=7, sep='(?:\]\s+\[)', engine = 'python', names=['timestamp', 'code', 'message'])
说明
read_csv 可以接收到一个.log 文件,因为它仍然是一个纯文本文件,所以参数定界符可以接收一个正则表达式,我选择的分隔文件的模式是'] ['字符你每行都有所以结果应该总是有3列,参数names
是你想要获得的列的名称。
skiprows
参数允许您跳过输入文件的 n 行。
注意这个正则表达式应该适用于 sep 之间有多个空格的文件,如果你确定这是一个制表符,你必须相应地更新正则表达式
我正在尝试转换如下所示的日志文件
Name: AGV
Version: 1.0.00
Revision: 0000000000
Build date: 2000-00-00 00:00:00
Continuation of previous file
[1639992888.497] [B62FF420] [DEBUG Wings.cpp:222] Current sidewing pressure: 3410
[1639992888.497] [B62FF420] [DEBUG Wings.cpp:222] Current sidewing pressure: 4206
[1639992888.517] [B62FF420] [DEBUG Wings.cpp:222] Current sidewing pressure: 3433
[1639992888.517] [B62FF420] [DEBUG Wings.cpp:222] Current sidewing pressure: 4229
[1639992888.527] [B62FF420] [INFO Position.cpp:438] <AGVPOS> 602, 7787.496,
到 csv 文件。
我尝试删除不需要的前几行并手动为列添加名称,然后这样做,这个
df = pd.read_fwf('data.log')
df.to_csv('data.csv', index=None)
这适用于第一个日志文件,但不适用于其他文件,因为我为每个文件都获得了一些额外的列。
我想要得到的输出是这样的
Timestamp. Code. Message
[1639992888.497] [B62FF420] [DEBUG Wings.cpp:222] Current sidewing pressure: 3410
[1639992888.497] [B62FF420] [DEBUG Wings.cpp:222] Current sidewing pressure: 4206
[1639992888.517] [B62FF420] [DEBUG Wings.cpp:222] Current sidewing pressure: 3433
[1639992888.517] [B62FF420] [DEBUG Wings.cpp:222] Current sidewing pressure: 4229
[1639992888.527] [B62FF420] [INFO Position.cpp:438] <AGVPOS> 602, 7787.496,
我的方法肯定不是最有效的,有没有其他方法可以做到这一点?
谢谢。
根据您的评论,这是最好的方法(之后您必须清理数据,但它会起作用)
import pandas as pd
df = pd.read_csv('test_fwf.log', skiprows=7, sep='(?:\]\s+\[)', engine = 'python', names=['timestamp', 'code', 'message'])
说明
read_csv 可以接收到一个.log 文件,因为它仍然是一个纯文本文件,所以参数定界符可以接收一个正则表达式,我选择的分隔文件的模式是'] ['字符你每行都有所以结果应该总是有3列,参数names
是你想要获得的列的名称。
skiprows
参数允许您跳过输入文件的 n 行。
注意这个正则表达式应该适用于 sep 之间有多个空格的文件,如果你确定这是一个制表符,你必须相应地更新正则表达式