Обработка данных с помощью Python для данных, разделенных строками и столбцами - PullRequest
0 голосов
/ 21 октября 2018

У меня есть данные, которые разделены строками (строка даты и времени) как таковые

01-Jan-1990 00:00:01 ABCD
A  abcde fghijk lmnopq
     hsjfne qqq                     # EDITED WITH ADDITONAL SPILL OVER DATA with \t
B abcde fghijk lmnopq
01-Jan-1990 00:00:05 ABCD
A ancfjhr sfjerhj egen
C etfhw3uh uhuefwh fewvjh dfeg efwbywgefb
D wrf fcwewe fvwefwe fwef
01-Jan-1990 00:00:07 ABCD
A wfw fbebwu
B fewhuf ifgiwejhifgj fijweij

Хотелось бы очистить их таким образом, чтобы отделить A, B, C и т. Д., Как показано на1-е значение после строки даты и времени в виде столбца и значения, которые следуют после A, B, C в качестве другого столбца, с последующим захватом даты и времени и вводом в качестве другого столбца.Что-то вроде этого

A,abcde fghijk lmnopq hsjfne qqq, 01-Jan-1990 00:00:01 #WOULD LIKE TO COMBINE THE SPILL DATA
B,abcde fghijk lmnopq, 01-Jan-1990 00:00:01
A,ancfjhr sfjerhj egen,01-Jan-1990 00:00:05
C,etfhw3uh uhuefwh fewvjh dfeg efwbywgefb,01-Jan-1990 00:00:05
D,wrf fcwewe fvwefwe fwefe,01-Jan-1990 00:00:05

etc etc etc

Очень хотелось бы, чтобы кто-нибудь мог вести меня.Я попытался прочитать, выполнив сопоставление с образцом, а затем получить следующие строки, но не смог его выполнить.

import re
#Log Reading

log=open("IDM.txt","r")


for line in log:
    splitLine = line.split()
    iterator = iter(splitLine)
    datematch = (re.match('^(([0-9])|([0-2][0-9])|([3][0-1])- 
   (JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)-\\d{4}$',splitLine[0]))
if datematch:
    print(line)

Поймите, что приведенный выше код не похож на то, что я хочу достичь, поэтому хотел бы, чтобы выребята, чтобы помочь мне вести меня и показать, что я пробовал кое-что.Спасибо за ваше время

РЕДАКТИРОВАНИЕ: Включена 3-я строка данных для отображения перетекания значения из 2-й строки данных с \ t табуляции перед строкой

Ответы [ 2 ]

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

Другим простым подходом является использование регулярного выражения: Регулярное выражение HOWTO и Печать списков на Python

  • читать из.txt file IDM.txt
  • удалил пробелы слева с помощью lstrip()
  • создал регулярное выражение pattern_num для поиска строки совпадения, начинающейся с цифр
  • log строка отформатирована для OP запрос
  • записать окончательные результаты в IDM_clean.txt

Обновление: окончательное и последнее решение в видеGeneralization:

import re


pattern_num = re.compile(r'^[0-9]') # patter we look in the string

log_list = []


#for line in file_as_list:
file_as_list = []

lines = open("IDM.txt", "r").read().split("\n")
for i, line in enumerate(lines):
    if line.startswith(" "):
        lines[i-1] = lines[+1].strip() + " " + line.lstrip()
        lines.pop(i)
    logs = '\n'.join(lines)+"\n"

file_as_list = logs.splitlines()

for l in file_as_list:
    if re.match(pattern_num, l):
        datos = l
    else:
        info = l[0] + ', ' + l[1:].lstrip()
        log_list.append(info + ', ' + datos)

        log = '\n'.join(map(str, log_list))

open("IDM_clean.txt", "w").write(log+"\n") # write to the file the result       


print("-----------------------------------")
print(type(log))
print("------------------------------------------------------------------------")
print(log)#print the desired format
print("------------------------------------------------------------------------")
Out:
----------------------------------
<class 'str'>
-----------------------------------------------------------------------
A, abcde fghijk lmnopq hsjfne qqq, 01-Jan-1990 00:00:01 ABCD
B, abcde fghijk lmnopq, 01-Jan-1990 00:00:01 ABCD
A, ancfjhr sfjerhj egen, 01-Jan-1990 00:00:05 ABCD
C, etfhw3uh uhuefwh fewvjh dfeg efwbywgefb, 01-Jan-1990 00:00:05 ABCD
D, wrf fcwewe fvwefwe fwef, 01-Jan-1990 00:00:05 ABCD
A, wfw fbebwu, 01-Jan-1990 00:00:07 ABCD
B, fewhuf ifgiwejhifgj fijweij, 01-Jan-1990 00:00:07 ABCD
-----------------------------------------------------------------------

Экран из файла:

A, abcde fghijk lmnopq hsjfne qqq, 01-Jan-1990 00:00:01 ABCD
B, abcde fghijk lmnopq, 01-Jan-1990 00:00:01 ABCD
A, ancfjhr sfjerhj egen, 01-Jan-1990 00:00:05 ABCD
C, etfhw3uh uhuefwh fewvjh dfeg efwbywgefb, 01-Jan-1990 00:00:05 ABCD
D, wrf fcwewe fvwefwe fwef, 01-Jan-1990 00:00:05 ABCD
A, wfw fbebwu, 01-Jan-1990 00:00:07 ABCD
B, fewhuf ifgiwejhifgj fijweij, 01-Jan-1990 00:00:07 ABCD
0 голосов
/ 21 октября 2018

Это всегда хорошая идея, чтобы открыть файл с помощью with open(), тогда вы можете анализировать строки, как вы хотите в списке, в моем случае я только что проверил, чтобы увидеть первые 2 символа строки это цифра,если это так, он сохраняет значение, которое будет добавлено к нужной строке позже:

import csv
content = []

with open('IDM.txt','r') as f:
    lines = f.readlines()
    for idx,line in enumerate(lines):
        if line[:2].isdigit():
                date = line[:20]

        elif idx == len(lines)-1 or (line[0] != ' ' and lines[idx+1][0] != ' '):
            data = line[0] + ',' + line[1:].rstrip('\n') 
            content.append(data+ ', '+ date)  

        elif lines[idx+1][0] == ' ':
            spill = lines[idx+1].rstrip('\n').strip()
            data = line[0] + ',' + line[1:].rstrip('\n') + ' ' + spill
            content.append(data+ ', '+ date)

        else:
            pass


with open('IDMOutput.csv','w') as f:
    for line in content:
        f.write("%s\n" % line)

>>content
['A, abcde fghijk lmnopq hsjfne qqqqq, 01-Jan-1990 00:00:01',
 'B, abcde fghijk lmnopq, 01-Jan-1990 00:00:01',
 'A, ancfjhr sfjerhj egen, 01-Jan-1990 00:00:05',
 'C, etfhw3uh uhuefwh fewvjh dfeg efwbywgefb, 01-Jan-1990 00:00:05',
 'D, wrf fcwewe fvwefwe fwef, 01-Jan-1990 00:00:05',
 'A, wfw fbebwu, 01-Jan-1990 00:00:07',
 'B, fewhuf ifgiwejhifgj fijweij, 01-Jan-1990 00:00:07']

Отредактировано: добавлено rstrip для удаления '\n' и включено timestamp и перетекание обновлено в вопрос свыход.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...