84669 orang belajar
152542 orang belajar
20005 orang belajar
5487 orang belajar
7821 orang belajar
359900 orang belajar
3350 orang belajar
180660 orang belajar
48569 orang belajar
18603 orang belajar
40936 orang belajar
1549 orang belajar
1183 orang belajar
32909 orang belajar
在这个test文件里。如果ID和DATE都相等,那么把他们合并到一行。ID,NAME,GENDER,AGE,KESHI,DATE,TYPE,DIAG保留第一行的值就好,PROJ_1至RE_6有值的话就依次往后面添加成一行。也就是ID和DATE都相同的话,就合并成一行。
test文件地址:http://pan.baidu.com/s/1slP4wsX
plus:最最最期望得到的结果为:
谢谢大家的帮助!
走同样的路,发现不同的人生
用Perl6实现了一个
#!/usr/bin/env perl6 class StudentInfo { has Str $.id; has Str $.name; has Str $.gender; has Str $.age; has Str $.keshi; has Str $.date; has Str $.type; has Str $.diag; has %.index; method new (Str $line) { self.bless(|self.parse-line($line)); } method parse-line(Str $line) { my @items = $line.split: ','; my @title = < id name gender age keshi date type diag >; my %hash; loop (my $i = +@title;$i < +@items;$i += 2) { if @items[$i] ne "" && @items[$i + 1] ne "" { # 去除空的 proj re unless %hash{@items[$i]}:exists { %hash{@items[$i]} = @items[$i + 1]; } } } my %ret = @title Z=> @items[0 .. +@title - 1]; # 拼接头部 %ret<index> := %hash; return %ret; } method num-of-proj() { +%!index.keys; } method hash-key() { return $!id ~ $!name; } method meger(::?CLASS:D: $other) { for $other.index.keys -> $key { unless %!index{$key}:exists { %!index{$key} = $other.index{$key}; } } } # $max - 指标的个数参数 method generate($max) { my @line = ($!id, $!name, $!gender, $!age, $!keshi, $!date, $!type, $!diag); my @keys := %!index.keys.sort; loop (my Int $i = 0;$i < $max;$i++) { if $i > @keys.elems - 1 { @line.append: ('', ''); } else { @line.append: (~@keys[$i], ~%!index{@keys[$i]}); } } return @line.join(','); } } # o 输出 # a 追加到 # i 指标个数 # debug # sub MAIN(Str :o(:output($out))?, Str :a(:append-to($append))?, Int :i(:index-max($index)) = 8, Bool :d(:debug($debug)) = False, *@files) { my %info; my @title; for @files -> $file { my @lines = $file.IO.lines; @title = @lines.shift.split: ','; for @lines -> $line { my StudentInfo $si .= new(~$line); ## note $si.perl if $debug; if %info{$si.hash-key}:exists { %info{$si.hash-key}.meger($si); } else { %info{$si.hash-key} := $si; } } } if $debug { for %info.values { .note if $debug; } } @title = @title[^8]; @title.append: (< PROJ_ RE_ > xx $index).flat Z~ ((1 ... $index) xx 2).flat.sort; if defined($append) || defined($out) { my $out-fh = defined($append) ?? $append.IO.open(:a) !! $out.IO.open(:w); $out-fh.say(@title.join(',')) if defined($out); for %info.values -> $value { $out-fh.say: $value.generate($index) if $value.num-of-proj >= $index; }; $out-fh.close; } else { for %info.values -> $value { say $value.generate($index) if $value.num-of-proj >= $index; }; } }
使用方法
[root@localhost tmp]# ./meger.p6 --help Usage: ./meger.p6 [-o|--output=<Str>] [-a|--append-to=<Str>] [-i|--index-max=<Int>] [-d|--debug] [<files> ...] [root@localhost tmp]# ./meger.p6 -o=out.put.log testSheet.csv testSheet.csv [root@localhost tmp]# cat out.put.log ID,NAME,GENDER,AGE,KESHI,DATE,TYPE,DIAG,PROJ_1,RE_1,PROJ_2,RE_2,PROJ_3,RE_3,PROJ_4,RE_4,PROJ_5,RE_5,PROJ_6,RE_6,PROJ_7,RE_7,PROJ_8,RE_8 179802,彭永彪,男,82,神经内科,2013/1/1,血清,脑梗塞,ALP,88,ALT,8,AST,18,DBIL,3.4,GGT,32,IBIL,8.9,TBIL,12.3,TP,59.4 179099,王元家,男,39,手足显微外科,2013/1/1,血清,足外伤,ALP,58,ALT,32,AST,19,DBIL,2.1,GGT,44,IBIL,12.2,TBIL,14.3,TP,61.5 181012,潘国华,男,94,心肺血管科,2013/1/1,血清,高血压,ALP,84,ALT,10,AST,13,DBIL,1.5,GGT,34,IBIL,2.6,TBIL,4.1,TP,52.8 180813,朱安清,男,40,骨二科,2013/1/1,血清,足外伤,ALP,73,ALT,36,AST,19,DBIL,3.9,GGT,24,IBIL,18.6,TBIL,22.5,TP,59.6 180188,刘田英,女,80,综合一科,2013/1/1,血清,高血压,ALP,92,ALT,25,AST,24,DBIL,3,GGT,78,IBIL,7.3,TBIL,10.3,TP,64.9 178748,邓晓运,女,77,肿瘤科,2013/1/1,血清,脑梗塞,ALP,48,ALT,13,AST,16,DBIL,1.8,GGT,48,IBIL,6.1,TBIL,7.9,TP,63.3 180974,王龙,男,25,骨一科,2013/1/1,血清,肱骨干骨折,ALP,82,ALT,34,AST,36,DBIL,4.1,GGT,38,IBIL,11.6,TBIL,15.7,TP,61.7 180940,赵金成,男,79,综合一科,2013/1/1,血清,冠心病,ALP,66,ALT,54,AST,26,DBIL,5.5,GGT,30,IBIL,12.1,TBIL,17.6,TP,59 181168,张永堂,男,63,骨二科,2013/1/1,血清,肱骨干骨折,ALP,59,ALT,25,AST,35,DBIL,5.2,GGT,33,IBIL,14.4,TBIL,19.6,TP,57.1 [root@localhost tmp]#
可以把记录都放到一个以ID和Date为key的字典里去,如果字典里没有这个 key,则直接放进去, 如果已经有了,则把“PROJ_1至RE_6有值的话就依次往后面添加”。
我不太清楚你的“合并成一行”是什么意思, 但是大致代码可以类似下面这样,如果合并的方式不对,你可以自己修改:
import csv result = {} with open('/Volumes/MacDocuments/Downloads/testSheet.csv', 'r') as csvfile: reader = csv.reader(csvfile) for row in reader: print(row) print(len(row)) key = '{}-{}'.format(row[0], row[5]) if result.get(key, None): result[key].extend(row[8:]) else: result[key] = row print(result)
用Perl6实现了一个
使用方法
可以把记录都放到一个以ID和Date为key的字典里去,如果字典里没有这个 key,则直接放进去, 如果已经有了,则把“PROJ_1至RE_6有值的话就依次往后面添加”。
我不太清楚你的“合并成一行”是什么意思, 但是大致代码可以类似下面这样,如果合并的方式不对,你可以自己修改: