【问题标题】:Transform a log file to csv using pandas使用 pandas 将日志文件转换为 csv
【发布时间】:2022-01-25 02:57:11
【问题描述】:

我正在尝试转换一个看起来像这样的日志文件

      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, 

我的方法肯定不是最有效的,有没有其他方法可以做到这一点?

谢谢。

【问题讨论】:

  • 在不知道您的其他日志文件的情况下,我无法确定最好的方法是什么,但我建议您不要使用read_fwf,而是使用带有skirows 参数和分隔符'\t' 的read_csv。如果你使用 fwf 你必须确定你的分隔符的位置是什么
  • read_csv 还允许您设置列名,因此您不必担心删除第一行
  • @Carlos 所有文件看起来像这样,除了其中一些文件之间有一些看起来像这样的行 Robot started Robot charging 我必须摆脱它,但其他行的格式几乎相同就像我提到的那样。
  • @Carlos 格式一般是这样的 [0000000000.000] [B62FF420] [DEBUG/INFO abcd:000] 一些消息

标签: python pandas dataframe export-to-csv


【解决方案1】:

根据您的评论,这是最好的方法(之后您必须清理数据,但它会起作用)

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 之间有多个空格的文件,您必须相应地更新正则表达式

【讨论】:

    猜你喜欢
    • 2017-03-02
    • 1970-01-01
    • 2021-07-24
    • 2011-02-19
    • 1970-01-01
    • 2021-03-23
    • 2013-04-04
    • 2020-12-17
    • 1970-01-01
    相关资源
    最近更新 更多