簡體   English   中英

解析文本文件並格式化為 CSV

[英]Parse Text File and Format as CSV

所以在我發布這個問題之前,我發現了一個與我的問題相似但不准確的問題。 如何將此文本文件格式解析為 CSV 格式?

我有一個需要解析的文本文件。

票號:2423
舊源 IPIP:1.1.1.1
舊源端口:50
主機IP:2.2.2.2
主機端口:52
漏洞利用:一些隨機漏洞利用
一堆隨機的電子郵件標題垃圾
票號:2423
舊源 IPIP:1.1.1.1
舊源端口:50
主機IP:2.2.2.2
主機端口:52
漏洞利用:一些隨機漏洞利用

我想解析出所有的“一堆隨機電子郵件標題垃圾”
解析后,我想格式化要在 CSV 文件中讀取的文本並創建標題,然后只在列中導入下面的數據。 最終結果應如下所示:

票號、舊源IPIP、舊源端口、主機IP、主機端口、漏洞利用
2423, 1.1.1.1, 50, 2.2.2.2, 52, SomeRANDOMexploit
2423, 1.1.1.1, 50, 2.2.2.2, 52, SomeRANDOMexploit

我找到了一種使用以下代碼解析行的方法:

import re

filename = "./input.txt"
infile = open(filename, 'r')
lines = infile.readlines()
lines[0:13]

for line in lines:
    if re.match("TICKET NUMBER|OLD SOURCE IP|OLD SOURCE PORT|HOST IP|HOST PORT|EXPLOIT", line):
        print(line.strip())

infile.close()

這擺脫了電子郵件標題垃圾。
我只是不知道如何獲取數據,然后將其格式化為 CSV,其中冒號可以分隔它並將標題放在列的頂部。

import csv
with open('output.txt', 'r') as in_file:
    stripped = [line.replace(":","").split() for line in in_file]
    zipped = zip([stripped]*1)

    with open('out_file.csv', 'w') as out_file:
        writer = csv.writer(out_file)
        writer.writerow(('TICKET NUMBER', 'OLD SOURCE IPIP', 'OLD SOURCE PORT', 'HOST IP', 'HOST PORT', 'EXPLOIT'))
        for group in zipped:
            writer.writerows(group)

上面的代碼讓我可以很好地編寫標題,但它將我的文本文件中的所有內容打印到同一行中的單獨列中

輸出

TICKET NUMBER, OLD SOURCE IPIP, OLD SOURCE PORT, HOST IP, HOST PORT, EXPLOIT  
['TICKET', 'NUMBER2423']    ['OLD', 'SOURCE', 'IPIP', '1.1.1.1']    ['OLD', 'SOURCE', 'PORT', '50'] ['HOST', 'IP2.2.2.2']   ['HOST', 'PORT']    ['EXPLOITSomeRANDOMexploit']    ['TICKET', 'NUMBER2423']    ['OLD', 'SOURCE', 'IPIP', '1.1.1.1']    ['OLD', 'SOURCE', 'PORT', '50'] ['HOST', 'IP2.2.2.2']   ['HOST', 'PORT']    ['EXPLOITSomeRANDOMexploit']

期望輸出

TICKET NUMBER, OLD SOURCE IPIP, OLD SOURCE PORT, HOST IP, HOST PORT, EXPLOIT  
2423, 1.1.1.1, 50, 2.2.2.2, 52, SomeRANDOMexploit  
2423, 1.1.1.1, 50, 2.2.2.2, 52, SomeRANDOMexploit  

根據我的理解,代碼是用空代替冒號,然后將兩個單詞合並為一個。 我也不知道如何讓它們打印到新行。

您可以使用 Python DictWriter來幫助解決此問題。 每個匹配的行都可以分配給一個行字典。 當找到不匹配的行時,可以寫入該行。 在缺少字段之一的情況下使用restval

例如:

import csv
import re

fields = ["TICKET NUMBER", "OLD SOURCE IPIP", "OLD SOURCE PORT", "HOST IP", "HOST PORT", "EXPLOIT"]
re_valid_field = re.compile('|'.join(fields))

with open('input.txt') as f_input, open('output.csv', 'w', newline='') as f_output:
    csv_output = csv.DictWriter(f_output, fieldnames=fields, restval='')
    csv_output.writeheader()

    row = {}

    for line in f_input:
        if re_valid_field.match(line):
            key, sep, value = line.strip().partition(':')
            row[key.strip()] = value.strip()
        elif row:
            csv_output.writerow(row)
            row = {}

    # Any remaining row to be written?
    if row:
        csv_output.writerow(row)

這將創建output.csv如下:

TICKET NUMBER,OLD SOURCE IPIP,OLD SOURCE PORT,HOST IP,HOST PORT,EXPLOIT
2423,1.1.1.1,50,2.2.2.2,52,SomeRANDOMexploit
2423,1.1.1.1,50,2.2.2.2,52,SomeRANDOMexploit

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM