文本如下
:BEGIN
"SN" "1"
"Machine" "1246"
"Nonumber" "11111"
FAI1 2.615 2.61 0.01 0.01 0.005
FAI6 1.998 2 0 0.01 0.002
FAI2 5.997 6.0 0 0.01 0.003
FAI3_2 0.102 0.1 0.02 0.02 0.002
FAI3_1 0.098 0.1 0.02 0.02 0.002
FAI4 3.998 4 0 0.01 0.002
:END
:BEGIN
"SN" "2"
"Machine" "1246"
"Nonumber" "11111"
FAI1 2.612 2.61 0.01 0.01 0.005
FAI6 1.996 2 0 0.01 0.004
FAI2 5.998 6.0 0 0.01 0.002
FAI3_2 0.099 0.1 0.02 0.02 0.001
FAI3_1 0.097 0.1 0.02 0.02 0.003
FAI4 3.995 4 0 0.01 0.005
:END
:BEGIN
"SN" "3"
"Machine" "1246"
"Nonumber" "11111"
FAI1 2.613 2.61 0.01 0.01 0.005
FAI6 1.999 2 0 0.01 0.001
FAI2 5.996 6.0 0 0.01 0.004
FAI3_2 0.105 0.1 0.02 0.02 0.005
FAI3_1 0.101 0.1 0.02 0.02 0.001
FAI4 3.997 4 0 0.01 0.003
:END
:BEGIN
"SN" "4"
"Machine" "1246"
"Nonumber" "11111"
FAI1 2.611 2.61 0.01 0.01 0.005
FAI6 1.997 2 0 0.01 0.003
FAI2 5.998 6.0 0 0.01 0.002
FAI3_2 0.098 0.1 0.02 0.02 0.002
FAI3_1 0.096 0.1 0.02 0.02 0.004
FAI4 3.999 4 0 0.01 -0.002
:END
想转换的格式是,按SN为列将后面重复的行转换到列上去,如下:
1 2 3 4
FAI1 2.615 2.612 2.613 2.611
FAI6 1.998 1.996 1.999 1.997
FAI2 5.997 5.998 5.996 5.998
FAI3_2 0.102 0.099 0.105 0.098
FAI3_1 0.098 0.097 0.101 0.096
FAI4 3.998 3.995 3.997 3.999
谢谢各位,已知格式是固定的,每一份样本数据是一:BEGIN开头,以:END结束,如果不知道,其中数据的行数该如何排列。
import re
a = ''':BEGIN
"SN" "1"
"Machine" "1246"
"Nonumber" "11111"
FAI1 2.615 2.61 0.01 0.01 0.005
FAI6 1.998 2 0 0.01 0.002
FAI2 5.997 6.0 0 0.01 0.003
FAI3_2 0.102 0.1 0.02 0.02 0.002
FAI3_1 0.098 0.1 0.02 0.02 0.002
FAI4 3.998 4 0 0.01 0.002
:END
:BEGIN
"SN" "2"
"Machine" "1246"
"Nonumber" "11111"
FAI1 2.612 2.61 0.01 0.01 0.005
FAI6 1.996 2 0 0.01 0.004
FAI2 5.998 6.0 0 0.01 0.002
FAI3_2 0.099 0.1 0.02 0.02 0.001
FAI3_1 0.097 0.1 0.02 0.02 0.003
FAI4 3.995 4 0 0.01 0.005
:END
:BEGIN
"SN" "3"
"Machine" "1246"
"Nonumber" "11111"
FAI1 2.613 2.61 0.01 0.01 0.005
FAI6 1.999 2 0 0.01 0.001
FAI2 5.996 6.0 0 0.01 0.004
FAI3_2 0.105 0.1 0.02 0.02 0.005
FAI3_1 0.101 0.1 0.02 0.02 0.001
FAI4 3.997 4 0 0.01 0.003
:END
:BEGIN
"SN" "4"
"Machine" "1246"
"Nonumber" "11111"
FAI1 2.611 2.61 0.01 0.01 0.005
FAI6 1.997 2 0 0.01 0.003
FAI2 5.998 6.0 0 0.01 0.002
FAI3_2 0.098 0.1 0.02 0.02 0.002
FAI3_1 0.096 0.1 0.02 0.02 0.004
FAI4 3.999 4 0 0.01 -0.002
:END'''
b = re.findall(':BEGIN[\s\S]*?(?=:BEGIN|$)',a)
z = {}
for m in b:
'''使用正则获取Machine数据'''
mach = re.search('(?<="Machine" ")(\d+)',m).group()
'''如果Machine不存在于集合中,增加集合子项'''
if mach not in z.keys():
z[mach] = {}
'''使用正则获取SN数据'''
sn = re.search('(?<="SN" ")(\d+)',m).group()
'''使用正则获取各行数据,以数字结尾的行为数据行'''
n = re.findall('[^\r\n]+\d(?=[\r\n]|$)',m)
'''对各行数据循环'''
for r in n:
'''使用split切分各行各自的数据'''
fai = r.split(' ')
if fai[0] not in z[mach].keys():
z[mach][fai[0]] = {}
z[mach][fai[0]][sn] = fai[1:]
print(z)
for m in z.keys():
print(m)
for fai in z[m]:
print(''.rjust(8),end='')
for sn in z[m][fai]:
print(sn.rjust(8),end='')
print()
break
for fai in z[m]:
print(fai.rjust(8),end='')
for sn in z[m][fai]:
print(z[m][fai][sn][0].rjust(8),end='')
print()
使用正则匹配,pandas读取成数据框,写入新的text中,代码如下:
import re
import pandas as pd
with open('t0401.txt','r',encoding='utf-8') as f:
data=f.read()
all=re.findall(':BEGIN(.*?):END',data,re.M|re.DOTALL)
cols=[]
FAI1,FAI6,FAI2,FAI3_2,FAI3_1,FAI4=[],[],[],[],[],[]
for a in all:
cols.append(re.findall('\"SN\" \"(.*)\"',a)[0])
FAI1.append(re.findall('FAI1 (.*)',a)[0].split()[0])
FAI6.append(re.findall('FAI6 (.*)',a)[0].split()[0])
FAI2.append(re.findall('FAI2 (.*)',a)[0].split()[0])
FAI3_2.append(re.findall('FAI3_2 (.*)',a)[0].split()[0])
FAI3_1.append(re.findall('FAI3_1 (.*)',a)[0].split()[0])
FAI4.append(re.findall('FAI4 (.*)',a)[0].split()[0])
df=pd.DataFrame([FAI1,FAI6,FAI2,FAI3_2,FAI3_1,FAI4],columns=cols,index='FAI1,FAI6,FAI2,FAI3_2,FAI3_1,FAI4'.split(','))
print(df)
df.to_csv('new.txt')
运行结果:
1 2 3 4
FAI1 2.615 2.612 2.613 2.611
FAI6 1.998 1.996 1.999 1.997
FAI2 5.997 5.998 5.996 5.998
FAI3_2 0.098 0.097 0.101 0.096
FAI3_1 0.102 0.099 0.105 0.098
FAI4 3.998 3.995 3.997 3.999
如对你有帮助,请点下采纳~
如果第一行中FAI不固定,一份数据有时候是5行,有时候是10行,但是每一个文本里面的格式是固定的,都是以:BEGIN开头,以:END结束,每一份文本中关于FAI的格式不固定,有时候是FAI1,有时候是FAI20,如何可以用一段代码实现相同的操作。就是第二份数据的第二列的数值,提到第一份数据的第三列,第三份的数据提到第一份数据的第四列,第五份提到第六列,以此类推。多谢
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!