将制表符分隔的日志行优雅转换为CSV矩阵

时间:2015-10-10 13:27:30

标签: python csv converter

我有一个标签分隔的日志文件,其中包含以下行:

event_a info1 info2
event_b info1 info4
event_c info2 info5 ...

我想将其转换为csv(使用Python),其中列具有含义。 info1例如是一个ID,info2是一个desintation,info4是一个坐标等。

我可以轻松地做到这一点"马虎"方式:

if "event_a" in line:
   columns = line.split()
   id = columns[1]

我更喜欢这样的查找矩阵或表结构,以便列的位置与编程逻辑分开。有没有什么东西可以让我在这里定义一个富有表现力的概述,以便我可以编写如下代码:

for line in csvfile:
    matches = event_table.match(line)
    for match in matches:
       event_table.convert(match) 
       # add commas in between the values to account for empty columns

我当然可以为每个事件创建一个类,但这似乎有点矫枉过正。我正在寻找的是一个中心定义,我可以使用它。

输出结果为:

 event_a, info1 info2
 event_b, info1, , , info4
 event_b, , info2, , , info5
 ...
 event_365, , , , , , , , , , , , info12 

编辑:日志文件包含100个这样的事件类型,这将使​​这段代码相当长而且难以维护这样做"瀑布" -parsing方式

1 个答案:

答案 0 :(得分:1)

听起来你可以先拆分这条线,然后用cell [0]来访问查找表

这是一种方法,虽然我觉得我正在打码高尔夫。

lines = ['fooevent\tfoo_info1\tfoo_info2',
     'barevent\tbar_info2\tbar_info4',
     'basevent\tbas_info2\tbas_info5'
     ]

mapper = {
    'fooevent':(1,2),
    'barevent':(2,4),
    'basevent':(2,5)
}

output_length = max([max(v) for v in mapper.values()]) + 1

a = lambda x,m: fields[1:][m.index(x)] if x in m else ''

for line in lines:

    fields = line.split('\t')
    data = [a(x,mapper[fields[0]]) for x in range(1,output_length)]
    data.insert(0,fields[0])
    print(','.join(data))

对于单个映射器使用散列可能比使用元组更容易,只是因为如果你的映射表变得更复杂,它们将更容易映射到其他数据类型。