繁体   English   中英

解析标有ANSI颜色转义序列的数据

[英]parsing data tagged with ANSI color escape sequences

在转换带有ANSI颜色转义序列和日期时间戳标记的数据的日志文件时需要帮助。 这是文本中行的格式:

'\x1b[34m[SOME_INFO]\x1b[0m \x1b[36m[SOME_OTHR_INFO]\x1b[0m Thu Sep 09 00:59:12 XST some variable length message which might contain commas (,), etc.'

我在一个几乎无法访问Internet且使用Python 2.7的隔离网络上。

我浪费了几个小时:(。我最近到达的是使用@Elliot Chance的解决方案

re.sub(r'\x1b\[[\d;]+m', '', s)

在此处提供的过滤出ANSI转义序列的方法如下:

t = re.sub(r'\x1b\[[\d;]+m', '~', s)
re.split(r'~|(Mon|Tue|Wed|Thu|Fri|Sat|Sun.*?\d{4})', t)

这没有给我我想要的东西。 上面代码的输出:

['',
 None,
 '[SOME_INFO]',
 None,
 ' ',
 None,
 '[SOME_OTHR_INFO]',
 None,
 ' ',
 'Thu',
 ' Sep 09 00:59:12 XST some variable length message which might contain commas (,), etc.']

我正在寻找的输出如下:

'SOME_INFO, SOME_OTHR_INFO, Thu Sep 09 00:59:12 XST, some variable length message which might contain commas (,), etc.

有没有一种方法可以使用pandas.read_csv()或类似的方法将数据加载到pandas数据pandas.read_csv()

注意:每行以转义码开头,但每行中可能有可变字段(即SOME_INFO, SOME_OTHR_INFO, ANOTHER_INFO, etc. followed by the timestamp followed by free text).

以下为我完成了工作:

import re
import pandas as pd

def split_line(s):
    t = re.sub(r'\x1b\[[\d]+m', '~', s) #assume ~ is not present in the free text field 
    t = re.sub('~\s+~|~\s+), '~', s)
    return filter(None, re.split('~|(\D{3}\s\D{3}\s\d{2}.*\d{4})\s+', t))

下一步:

  • 使用以下命令将文件读取到单列数据框中
df = pd.read_csv(file_name, header=None, sep='\n', engine='python', index_col=False)
  • 将上面的函数应用于上面的数据框的每一行。 我在应用pd.apply()遇到了麻烦,所以我最终使用了列表pd.apply()方法
col_names = ['A', 'B', 'C', 'D']
df = pd.DataFrame([split_line(str(s)) for s in df[0], columns=col_names]
df.head()
  • 最后使用df.to_csv()将文件写入csv

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM