Разделение данных и распределение отсортированных данных по столбцам для представления Excel с использованием Python - PullRequest
0 голосов
/ 22 октября 2018

Привет У меня есть набор данных, как показано ниже (фиктивные данные для замены школьных данных) в текстовом файле

01-01-1998 00:00:00 AM  GP: D(B):1234 to time difference. Hourly Avg:-3 secs
01-01-1998 00:00:12 AM  GP: D(A): 2345 to time difference. Hourly Avg:0 secs
01-01-1998 00:08:08 AM  SYS: The Screen Is now minimised.
01-01-1998 00:09:10 AM  00:09:10 AM SC: Findcorrect: W. D:1. Count one two three four five.       #there are somehow some glitch in the system showing 2 timestamp
01-01-1998 00:14:14 AM  SC: D1 test. Old:111, New:222, Calculated was 123, out of 120 secs.    
01-01-1998 01:06:24 AM  ET: Program Disconnected event.

Я хотел бы привести в порядок данные, как показано до желаемого результата ниже вформат

[['Timestamp','System','Di','Message']    #  <-- header
['01-01-1998 00:00:00 AM', 'GP:','D(B):','1234 to time difference. Hourly Avg:-3 secs'],
['01-01-1998 00:00:12 AM', 'GP:','D(A):', '2345 to time difference. Hourly Avg:0 secs'],
['01-01-1998 00:08:08 AM', 'SYS:','','The Screen Is now minimised.'],   #<-- with a blank
['01-01-1998 00:09:10 AM', 'SC:','','Findcorrect: HW. D:1. Count one two three four five.'],
['01-01-1998 00:14:14 AM', 'SC:','D1','test. Old:111, New:222, Calculated was 123, out of 120 secs.' ],
['01-01-1998 01:06:24 AM', 'ET:','', 'Program Disconnected event.']]

В основном я хотел бы добавить заголовок с самого начала, а затем позволить данным помещаться в 4 столбца (Timestamp, ststem, Di и message).Часть проблемы, которая может быть проблемой, заключается в том, что в строке 4 исходных данных она дублирует дополнительную временную метку в системе, что приводит к необходимости ее очистки.

Поле Di в основном будет принимать "D (A), D (B), D1 и D2

Остальная часть строки будет находиться под полем Message. Тогда окончательный результат будетв файл Excel для анализа данных.

Код, показанный ниже, является тем, что я пробовал (слабый в Python)

import re
from itertools import islice
from itertools import groupby
from operator import itemgetter
import xlsxwriter
import pandas as pd
import os

content = []

with open("DTBL.log","r") as infile:
    for line in infile.readlines():
        words = line.split(" ")
        #print(line)
        #content.append(words).split(',')
        print(words)
        timestamp = line[:22]
        system = line[23:28]
        ##print(timestamp)
        content.append(timestamp + ', ' + system + ','+(line[29:]).rstrip('\n'))
        print(content)

for l in content:
    if l[-2].isdigit():

Из-за недостатка знаний в Python код не полностьюразработан, и я буду очень признателен за любое руководство или пример! Некоторые вопросы для размышления, я использую pandas / dataframe? или я могу просто сделать это без pd?

РЕДАКТИРОВАНИЕ: 1-я строка данных обновлена ​​до«D (B) 1234», между цифрами и D (B)

не должно быть пробела.

1 Ответ

0 голосов
/ 22 октября 2018

Код для очистки этих данных mess использует частично регулярное выражение, частично интерполяцию строк.

Для записи очищенного csv используется модуль csv из-за необходимости маскировать внутренний , в тексте (например, в строке с Old:111, New:222, ...):

Createдемонстрационный файл:

with open("data.txt","w") as w:
    w.write("""01-01-1998 00:00:00 AM  GP: D(B): 1234 to time difference. Hourly Avg:-3 secs
01-01-1998 00:00:12 AM  GP: D(A): 2345 to time difference. Hourly Avg:0 secs
01-01-1998 00:08:08 AM  SYS: The Screen Is now minimised.
01-01-1998 00:09:10 AM  00:09:10 AM SC: Findcorrect: W. D:1. Count one two three four five.       #there are somehow some glitch in the system showing 2 timestamp
01-01-1998 00:14:14 AM  SC: D1 test. Old:111, New:222, Calculated was 123, out of 120 secs.    
01-01-1998 01:06:24 AM  ET: Program Disconnected event.""")

Синтаксический анализ и запись:

import re

def parseLine(line):
    # get the timestamp
    ts = re.match(r"\d{2}-\d{2}-\d{4} \d{2}:\d{2}:\d{2} +(?:AM|PM)",line)

    # get all but the timestamp - cleaning the double-time issue
    cleaned = re.sub(r"^\d{2}-\d{2}-\d{4} (\d{2}:\d{2}:\d{2} (AM|PM) +)+","", line)

    # split cleaned part based on occurence of ["D(A)", "D(B)", "D1", "D2"]
    if any(k in cleaned.split(":")[1] for k in ["D(A)", "D(B)", "D1", "D2"]):
        system, di, msg = cleaned.split(" ", maxsplit = 2)
    else:
        di = ""
        system, msg = cleaned.split(":", maxsplit = 1)

    # return each line as list of cleaned stuff:
    return [ts[0].strip() ,system.strip(), di.strip(), msg.strip()]

# fixed header, lines will be appended   
p = [['Timestamp','System','Di','Message']]

with open("data.txt","r") as r:
    for l in r:
        l = l.strip()
        p.append(parseLine(l))

import csv
with open("c.csv","w",newline="") as w:
    writer = csv.writer(w,quoting=csv.QUOTE_ALL)
    writer.writerows(p)

Считывание и вывод записанного файла:

with open("c.csv") as r:
    print(r.read())

File-Content (mask csv) elsest. Old:111, New:222, Calculated was 123, ... повредит ваш формат:

"Timestamp","System","Di","Message"
"01-01-1998 00:00:00 AM","GP:","D(B):","1234 to time difference. Hourly Avg:-3 secs"
"01-01-1998 00:00:12 AM","GP:","D(A):","2345 to time difference. Hourly Avg:0 secs"
"01-01-1998 00:08:08 AM","SYS","","The Screen Is now minimised."
"01-01-1998 00:09:10 AM","SC","","Findcorrect: W. D:1. Count one two three four five.       #there are somehow some glitch in the system showing 2 timestamp"
"01-01-1998 00:14:14 AM","SC:","D1","test. Old:111, New:222, Calculated was 123, out of 120 secs."
"01-01-1998 01:06:24 AM","ET","","Program Disconnected event."
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...