Как я могу выбрать определенную строку в текстовом файле и перечислить ее в CSV-файл? - PullRequest
0 голосов
/ 28 сентября 2018

Вот мой контент в моем текстовом файле: и я только хочу получить этот sha1 и описание, затем проанализировать его в CSV-файл, используя префикс и разделитель, обрезать строки, затем выбрал sha1 между "\" и "-> "тогда я хочу получить описание.

         +----------------------------------------------------+
         |          VSCAN32            Ver 2.00-1655          |
         |                                                    |
         |     Copyright (c) 1990 - 2012 xxx xxx xxx Inc.     |
         |                                                    |
         |    Maintained by xxxxxxxxx  QA for VSAPI Testing   |
         +----------------------------------------------------+

Setting Process Priority to NORMAL: Success 1

Successfully setting POL Flag to 0
VSGetVirusPatternInformation is invoked
Reading virus pattern from lpt$vpn.527 (2018/09/25) (1452700)


Scanning samples_extracted\88330686ae94a9b97e1d4f5d4cbc010933f90f9a->(MS Office 2007 Word 4045-1)
->Found Virus [TROJ_FRS.VSN11I18]



Scanning samples_extracted\8d286d610f26f368e7a18d82a21dd68b68935d6d->(Microsoft RTF 6008-0)
->Found Virus [Possible_SMCCVE20170199]



Scanning samples_extracted\a10e5f964eea1036d8ec50810f1d87a794e2ae8c->(ASCII text 18-0)
->Found Virus [Trojan.VBS.NYMAIM.AA]


18 files have been checked.
 Found 16 files containing viruses.
(malloc count, malloc total, free total) = (0, 35, 35)

Пока это мой код: он все еще выводит много строк, но мне нужно только проанализировать sha1 и описание вCSV Я использовал split, чтобы sha1 можно было выбрать между "\" и "->", он помещает sha1, но описание не обрезается, и содержимое все еще там

import csv

INPUTFILE = 'input.txt'
OUTPUTFILE = 'output.csv'
PREFIX = '\\'
DELIMITER = '->'

def read_text_file(inputfile):
    data = []
    with open(inputfile, 'r') as f:
        lines = f.readlines()

    for line in lines:
        line = line.rstrip('\n')
        if not line == '':
            line = line.split(PREFIX, 1)[-1]
            parts = line.split(DELIMITER)
            data.append(parts)

    return data

def write_csv_file(data, outputfile):
    with open(outputfile, 'wb') as csvfile:
        csvwriter = csv.writer(csvfile, delimiter=',', quotechar='"',
                                quoting=csv.QUOTE_ALL)
        for row in data:
            csvwriter.writerow(row)

def main():
    data = read_text_file(INPUTFILE)
    write_csv_file(data, OUTPUTFILE)

if __name__ == '__main__':
    main()

Вот что я хочу в моем csv: sha1 и описании, но мой выходной файл отображает весь текстовый файл, но он отфильтровал sha1 и поместил его в столбец sha1 and description only

РЕДАКТИРОВАТЬ: Сначала он работал, но эта строка текста может быть помещена в CSV-файл из-за его нескольких строк, любой ответ, пожалуйста?

Scanning samples_extracted\0191a23ee122bdb0c69008971e365ec530bf03f5
 - Invoice_No_94497.doc->Found Virus [Trojan.4FEC5F36]->(MIME 6010-0)

 - Found 1/3 Viruses in samples_extracted\0191a23ee122bdb0c69008971e365ec530bf03f5

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018
import re
import pandas as pd
a=open("inputfile","a+")
storedvalue=[]
for text in a.readlines():
    matched_words=(re.search(r'\d.+?->\(.*?\)',text))
    if matched_words!=None:
        matched_words=matched_words.group()
        matched_words=matched_words.split("->")
        storedvalue.append(tuple(matched_words))
dataframe=pd.DataFrame(storedvalue,columns=["hashvalue","description"])
dataframe.to_csv("output.csv")

Результат будет:

hashvalue                                     description
88330686ae94a9b97e1d4f5d4cbc010933f90f9a    (MS Office 2007 Word 4045-1)
8d286d610f26f368e7a18d82a21dd68b68935d6d    (Microsoft RTF 6008-0)
10e5f964eea1036d8ec50810f1d87a794e2ae8c     (ASCII text 18-0)
0 голосов
/ 28 сентября 2018

С минимальными изменениями - вы можете использовать эту часть кода:

for line in lines:
    line = line.rstrip('\n')
    if not line == '' and DELIMITER in line and not "Found" in line: # <---
        line = line.split(PREFIX, 1)[-1]
        parts = line.split(DELIMITER)

Но я бы предпочел использовать регулярное выражение:

import re

for line in lines:
    line = line.rstrip('\n')
    if re.search(r'[a-zA-Z0-9]{40}->\(', line): # <----
        line = line.split(PREFIX, 1)[-1]
        parts = line.split(DELIMITER)
        data.append(parts)

Результат будет:

cat output.csv
"88330686ae94a9b97e1d4f5d4cbc010933f90f9a","(MS Office 2007 Word 4045-1)"
"8d286d610f26f368e7a18d82a21dd68b68935d6d","(Microsoft RTF 6008-0)"
"a10e5f964eea1036d8ec50810f1d87a794e2ae8c","(ASCII text 18-0)"
...