python - 使用 Python 对按行和列分隔的数据进行数据处理
问题描述
我有一个由行(日期时间行)分隔的数据
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 等分开的方式清理它,如日期时间行之后的第一个值所示为一列,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 制表符
解决方案
使用 打开文件总是一个好主意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
并溢出更新的输出。
推荐阅读
- sql - 好友请求的数据库设计
- javascript - 如何使用此 Javascript 解决方案在 Web 表单上的 div 之间正确切换?
- excel - 使用 SumProduct 的加权平均 IFs 语句
- sql - 在过程中隐藏 SELECT 结果
- matlab - 在 arrayfun 调用中使用 set 设置 yaxis(1) 和 yaxis(2) 的属性
- visual-studio-2013 - 排除 Visual Studio Web 部署项目中的文件夹以及所有子文件夹和文件
- django - Django 模型 - CharField 作为其他字段的串联
- android - android共享首选项不起作用
- php - 试图获取非对象的属性“用户”
- c# - wpf - notifyIcon - 鼠标事件 - 识别鼠标按钮