文件按条件将多行合并为一行?
澳门银河官网
澳门银河官网
当前位置 : 澳门银河官网 > 澳门银河官网

文件按条件将多行合并为一行?

在这个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-lineStr $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 MAINStr :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.readercsvfile
    for row in reader:
        printrow
        printlenrow
        key = {}-{}.formatrow[0], row[5]
        if result.getkey, None:
            result[key].extendrow[8:]
        else:
            result[key] = row

printresult

栏目列表

广告位

澳门银河官网