操作具有无序字段的行

操作具有无序字段的行

我有这个数据集,但想将其转换为有组织的 Csv 数据文件,挑战是字符串说 OBI 并不总是在下一行的同一字段上!

NAM: 0,CDC: 0,SUBSPDPCPVERS: 4,CAMP: 0,serv: CSPS,CSLOC: 2,PSLOC: 2,GSMUEFEAT: 0,UNKNLOCDATECS:: EAoL,UNKNLOCDATEPS:: EAoL,OBI: 1
NAM: 0,CDC: 4,SUBSPDPCPVERS: 4,CAMP: 0,serv: CSPS,CSLOC: 2,PSLOC: 2,GSMUEFEAT: 0,UNKNLOCDATECS:: EAoL,UNKNLOCDATEPS:: EAoL,OSB1: 1
NAM: 0,CDC: 1,CAMP: 0,serv: CSPS,CSLOC: 2,PSLOC: 2,GSMUEFEAT: 0,UNKNLOCDATECS:: EAoL,UNKNLOCDATEPS:: EAoL,OBI: 1,OSB1: 1
NAM: 0,CDC: 0,CAMP: 0,serv: CSPS,CSLOC: 2,PSLOC: 2,GSMUEFEAT: 0,UNKNLOCDATECS:: EAoL,UNKNLOCDATEPS:: EAoL,OBI: 1,OSB1: 1
NAM: 0,CDC: 422,SUBSPDPCPVERS: 4,CAMP: 0,serv: CSPS,CSLOC: 2,PSLOC: 2,GSMUEFEAT: 0,UNKNLOCDATECS:: EAoL,UNKNLOCDATEPS:: EAoL,OSB1: 1

我希望得到这个输出:一直在尝试使用 rs 在该字段的行中查找并逐个字段返回,然后我加入文件,但它无效

NAM,CDC,SUBSPDPCPVERS,CAMP,serv,CSLOC,PSLOC,GSMUEFEAT,UNKNLOCDATECS,UNKNLOCDATEPS,OBI,OSB1
0,0,4,:0,CSPS,2,2,:0,:EAoL,:EAoL,1,
0,4,4,:0,CSPS,2,2,:0,:EAoL,:EAoL,,1
0,1,,:0,CSPS,2,2,:0,:EAoL,:EAoL,1,1
0,0,,:0,CSPS,2,2,:0,:EAoL,:EAoL,1,1
0,422,4,:0,CSPS,2,2,:0,:EAoL,:EAoL,,1

答案1

perl -nlE 'if($.==1){                            # if first line 
              @L = /(\w+):/g ;                   # L = list of keys
              say join(",",@L)}                  # print header 
           ($a,%b)=split(/\s*,?(\w+):/,$_,-1);   # b: dict of (keys, values)  
           say join(",", map { $b{$_} } @L)'  ex.txt

相关内容