2017-04-12 46 views
0

我有一项任务,按时间顺序排列下面的数据,并根据时间戳列出数据。如何在python中按时间顺序排列事件和数据

如果有人能指导我完成逻辑,我可以尝试自己编写代码。

输入:

Timestamp   : 2017-02-13 12:07:25.040000 UTC 
Event Name  : linkManager/link-event 
DataFields  : [srcSwName:X, srcPortName:ethernet30, dstSwName:X, dstPortName:ethernet3, fabricLinkEventType:X reason:Port Down] 

Timestamp   : 2017-02-13 12:07:26.040000 UTC 
Event Name  : eventManager/event 
DataFields  : [srcSwName:X, srcPortName:ethernet30, dstSwName:X, dstPortName:ethernet3, fabricLinkEventType:X, reason:Port Down] 

Timestamp   : 2017-02-13 12:07:25.040000 UTC 
Event Name  : linkManager/link-event 
DataFields  : [srcSwName:X, srcPortName:ethernet29, dstSwName:X, dstPortName:ethernet3, fabricLinkEventType:X reason:Port Down] 

Timestamp   : 2017-02-13 12:07:26.040000 UTC 
Event Name  : eventManager/event 
DataFields  : [srcSwName:X, srcPortName:ethernet30, dstSwName:X, dstPortName:ethernet3, fabricLinkEventType:X, reason:Port Down] 

Timestamp   : 2017-02-13 12:07:25.040000 UTC 
Event Name  : eventManager/event 
DataFields  : [srcSwName:X, srcPortName:ethernet30, dstSwName:X, dstPortName:ethernet3, fabricLinkEventType:X, reason:Port Down] 

预期输出:

Timestamp   : 2017-02-13 12:07:25.040000 UTC 
Event Name  : linkManager/link-event 
DataFields  : [srcSwName:X, srcPortName:ethernet30, dstSwName:X, dstPortName:ethernet3, fabricLinkEventType:X reason:Port Down] 

Timestamp   : 2017-02-13 12:07:25.040000 UTC 
Event Name  : linkManager/link-event 
DataFields  : [srcSwName:X, srcPortName:ethernet29, dstSwName:X, dstPortName:ethernet3, fabricLinkEventType:X reason:Port Down] 

Timestamp   : 2017-02-13 12:07:25.040000 UTC 
Event Name  : eventManager/event 
DataFields  : [srcSwName:X, srcPortName:ethernet30, dstSwName:X, dstPortName:ethernet3, fabricLinkEventType:X, reason:Port Down] 

Timestamp   : 2017-02-13 12:07:26.040000 UTC 
Event Name  : eventManager/event 
DataFields  : [srcSwName:X, srcPortName:ethernet30, dstSwName:X, dstPortName:ethernet3, fabricLinkEventType:X, reason:Port Down] 

Timestamp   : 2017-02-13 12:07:26.040000 UTC 
Event Name  : eventManager/event 
DataFields  : [srcSwName:X, srcPortName:ethernet30, dstSwName:X, dstPortName:ethernet3, fabricLinkEventType:X, reason:Port Down] 
+0

你可以找到一种方式来读取文件,每行有''检查',如果它是'Timestamp','Event Name'或'Datafields'。如果是这样,将它追加到一个特定的列表中(每个变量列表中有一个列表:list_timestamp,list_event_name和list_datafields),然后你可以压缩你创建的列表,通过时间戳记压缩列表。在所有这些过程完成后,您可以使用'for循环'重新创建文件布局,同时用'.format()'打印每个变量' –

回答

0

让我们来想象这是一个文件

import itertools 

with open('filename') as f: 
    # Extract blocks by splitting on empty lines 
    blocks = [list(val) for key, val in 
       itertools.groupby(f, lambda x: bool(x.rstrip())) 
       if key] 

    # Now the top line on each block has a timestamp so compare it: 
    blocks.sort(key=lambda x: x[0].split(':')[-1]) 

with open('out_file', 'w') as f: 
    # Write back the blocks with a new line separator to new file: 
    for block in blocks: 
     f.writelines(block + ['\n']) 
0

您需要read文件并加载它INT o,例如,list。然后将代表为UTC时区的TimeStamp的第一个值字段转换为timestamp

例如:

Timestamp   : 2017-02-13 12:07:25.040000 UTC 

包含2017-02-13 12:07:25.040000可以通过timestamp使用datetime模块类似这样的例子来代替:

from datetime import datetime 
a = '2017-02-13 12:07:25.040000' 
b = datetime.datetime.strptime(a, "%Y-%m-%d %H:%M:%S.%f").timestamp() 
print(b) 
>>> 1486984045.04 

现在,您可以创建一个method或者你可以简单地用一个lambda像这样的功能:

# Note: x should be a string 
get_timestamp = lambda x: datetime.datetime.strptime(x, "%Y-%m-%d %H:%M:%S.%f").timestamp() 

然后,您可以sort您的list由您的新methodlmabda函数返回timestamp数据。

相关问题