我在原始文本文件(它是一个日志文件)中有一个数据集,我正在用这个文本文件逐行读取准备python列表,用这个列表我将用pyspark创建一个dataframe。如果你看到数据集,各个列中缺少一些值,我想用“NA”填充它。这是数据集的示例,缺少的值可以在任何列中,列之间用空格隔开
==============================================
empcode Emnname Date DESC
12d sf 2018-02-06 dghsjf
asf2 asdfw2 2018-02-16 fsfsfg
dsf21 sdf2 2016-02-06 sdgfsgf
sdgg dsds dkfd-sffddfdf aaaa
dfd gfg dfsdffd aaaa
df dfdf efef
4fr freff
----------------------------------------------
代码:
path="something/demo.txt"
EndStr="----------------------------------------------"
FilterStr="=============================================="
findStr="empcode Emnname"
def PrepareList(findStr):
with open(path) as f:
out=[]
for line in f:
if line.rstrip()==Findstr:
#print(line)
tmp=[]
tmp.append(re.sub("\s+",",",line.strip()))
#print(tmp)
for line in f:
if line.rstrip()==EndStr:
out.append(tmp)
break
tmp.append(re.sub("\s+",",",line.strip()))
return (tmp)
f.close()
LstEmp=[]
LstEmp=prepareDataset("empcode Emnname Dept DESC")
print(LstEmp)
我的输出是:
['empcode,Emnname,Date,DESC',
'12d,sf,2018-02-06,dghsjf',
'asf2,asdfw2,2018-02-16,fsfsfg',
'dsf21,sdf2,2016-02-06,sdgfsgf',
'sdgg,dsds,dkfd-sffddfdf,aaaa',
'dfd,gfg,dfsdffd,aaaa',
'df,dfdf,efef',
'4fr,freff']
预期产量:
['empcode,Emnname,Date,DESC',
'12d,sf,2018-02-06,dghsjf',
'asf2,asdfw2,2018-02-16,fsfsfg',
'dsf21,sdf2,2016-02-06,sdgfsgf',
'sdgg,dsds,dkfd-sffddfdf,aaaa',
'dfd,gfg,dfsdffd,aaaa',
'df,NA,dfdf,efef',
'4fr,NA,NA,freff']
从数据集中可以看出,字段中的文本长度是可变的,字段本身以固定位置开始和结束。这通常发生在制表符分隔的字段中。你知道吗
如果是这种情况,应采用以下方法:
我已经用
\t
替换了代码中的\s
,并删除了+
。 在python正则表达式中,+
符号展开以匹配它前面的一个或多个正则表达式。在这种情况下,\s
从第一个字段的末尾扩展到下一个字段。你知道吗或者,如果输入文件不是以制表符分隔的,则可以提取考虑固定长度字段的字段值,然后执行
strip()
在这里,我尝试遵循一种通用方法,在这种方法中,您不必在代码中预编程列跨距。用于返回数据帧,可以使用pd.read\U csv文件和斯特林吉奥。请根据您的文件位置修改路径。这段代码是从您的代码中扩展出来的,以使您更容易理解,否则还有更有效的方法来编写相同的逻辑
为了将元组列表转换为pyspark数据帧,这里有一个教程http://bigdataplaybook.blogspot.in/2017/01/create-dataframe-from-list-of-tuples.html
相关问题 更多 >
编程相关推荐