首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何匹配两个.csv文件并在第三个文件上写入用文件1中的数据替换文件2中的数据

如何匹配两个.csv文件并在第三个文件上写入用文件1中的数据替换文件2中的数据
EN

Stack Overflow用户
提问于 2019-05-22 21:16:44
回答 2查看 71关注 0票数 0

我有2个csv和文本文件,文件1有2列,一列是基因id,两列是基因名称,文件2有许多列,列中字符串的一部分是基因id,例如基因id(基因组)或伪基因id(基因组)。我想将文件1中的每个基因id与文件2中的每个基因id进行比较,并将文件2中的基因id替换为文件3中打印的文件1中的基因名称。

文件1;

代码语言:javascript
复制
SPAR5_0024, coA binding domain protein                    
SPAR5_0025, hypothetical protein                    
SPAR5_0026, hypothetical protein  

文件2;

代码语言:javascript
复制
SPAR5_0024(72.AFAX01.1.gb) SPAR5_0026(72.AFAX01.1.gbff) SPAR5_0025(72.AFAX01.1.gbff)

所需输出(文件3);

代码语言:javascript
复制
coA binding domain protein(72.AFAX01.1.gb) hypothetical protein(72.AFAX01.1.gbff) hypothetical protein(72.AFAX01.1.gbff)

使用我的代码,我得到一个空文件3

这就是我正在运行的;

代码语言:javascript
复制
#!/usr/local/bin/perl -w

use strict;
use warnings;

my $file1 = "annot.txt";
my $file2 = "orthomcl.csv";
my $file3 = "combi.csv";

open (FILE1,"$file1") || die;
open (FILE2,"$file2") || die;
open (FILE3,">$file3") || die;


my @file1 = <FILE1>;
my @file2 = <FILE2>;


my %file1;
while ( my $value = <FILE1> ) {
    chomp $value;
    my @file1 = split /\s+/, $_;
    $file1{$value} = 1;
}

my %file2;
while (my $value = <FILE2>) {
    chomp $value;
    my @file2 = split /\s+/, $_;
    if ( $file1{ $value } ) {
        $file2 = $file1{ $file2 };
        print join( "\t" => @file2 ), $/;
    }
}

close (FILE1);
close (FILE2);
close (FILE3);

所需输出(文件3)

代码语言:javascript
复制
coA binding domain protein(72.AFAX01.1.gb) hypothetical protein(72.AFAX01.1.gbff) hypothetical protein(72.AFAX01.1.gbff)
EN

回答 2

Stack Overflow用户

发布于 2019-05-22 21:42:20

主要的错误是

代码语言:javascript
复制
my @file1 = <FILE1>;

my @file2 = <FILE2>;

使用文件中的所有数据,这样就没有什么可供读取的

代码语言:javascript
复制
while ( my $value = <FILE1> ) {

代码语言:javascript
复制
while (my $value = <FILE2>) {
票数 0
EN

Stack Overflow用户

发布于 2019-05-23 03:29:26

以下是如何将批注从第一个文件annot.txt插入到第二个文件orthomcl.csv的示例

代码语言:javascript
复制
use feature qw(say);
use strict;
use warnings;

{
    my $map = read_annot();
    my ($regex) = map {qr /$_/} join '|', map {quotemeta} keys %$map;
    my $fn = 'orthomcl.csv';
    open ( my $fh, '<', $fn ) or die "Could not open file '$fn': $!";
    my $str = do { local $/; <$fh> };
    close $fh;
    $str =~ s/($regex)/$map->{$1}/ge;
    save_combi( $str );
}

sub save_combi {
    my ( $str ) = @_;

    my $fn = 'combi.csv';
    open ( my $fh, '>', $fn ) or die "Could not open file '$fn': $!";
    print $fh $str;
    close $fh;

    say "Saved: '$fn'";
}

sub read_annot {
    my $fn = 'annot.txt';
    open ( my $fh, '<', $fn ) or die "Could not open file '$fn': $!";
    my %map;
    while (my $line = <$fh> ) {
        chomp $line;
        my ( $key, $value ) = $line =~ /^(\S+),\s+(.*)$/;
        $value =~ s/\s+$//;
        if (defined $key) {
            $map{$key} = $value;
        }
    }
    close $fh;
    return \%map;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56257775

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档