在 Perl 中,参考文件和一系列文件之间的映射

2024-01-04

我想在 Perl 中映射两个数据集。我有一个不变的数据集(ref 1),必须从一系列文件(1-20)中提取其他数据以匹配 ref1。

Ref1
ID1    ID2
1       HZ
1       HX
1       HY
2       C  
2       HZ
2       N

File 1
ID2    ID3
HA      5 
HB      4
HC      7
N       2

File 2
ID2    ID3
C      9
HZ     11
N      0

理想输出:

ID1 ID2 ID3 
1   HZ   5
1   HX   4 
1   HY   7
2   C    9
2   HZ   11
2   N    0

匹配发生在 ref1 中 ID2 的第一个字母与 file1 中 ID2 的第一个字母之间,直到完成所有 ID1 条目的匹配,然后打开 file2 并与所有编号为 2 的 ID1 进行匹配。文件名的格式为 number001.txt 、number002.txt等,因此可以从文件名中检索ID1。

我希望这是有道理的。我是 Perl 的初学者,这是我到目前为止所拥有的:

#!/usr/bin/perl
use strict;
use warnings;

my $ref1 = 'test.txt';
my $input_path = '/path/';

open my $fh, '<' $ref1 or die "Can't read $ref1: $!";
chomp (my @ref1 = <$fh>);

my %hash = @ref1;

my @filehandles;
for ($i=0; $i<20, $i++) {
    local *FILE;
    open(FILE, ">number$i.txt") or die $!;
    push(@filehandles, *FILE);
}

任何建议都会非常有帮助。


这并没有按照您的想法进行:

chomp (my @ref1 = <$fh>);
my %hash = @ref1;

在这里转置键/值并没有什么魔力——所以你要做的就是得到一个如下所示的哈希值:

      '2       C  ' => '2       HZ',
      'ID1    ID2' => '1       HZ',
      '1       HX' => '1       HY',
      '2       N' => undef

我打赌那不是你想要的。

我怀疑你可能想要的是:

    my %ref1;
    while ( <$input> ) {
        chomp;
        my ( $key, $value ) = split;
        push ( @{$ref1{$key}}, $value );
    }
    print Dumper \%ref1;

您还将打开文件以便在第二个循环中进行写入。您可能也不想这样做。

我会选择类似的东西:

#!/usr/bin/perl
use strict;
use warnings;

use Data::Dumper;

my $ref1       = 'ref1.txt';
my $input_path = '/path/';

open my $ref1_fh, '<', $ref1 or die "Can't read $ref1: $!";

my %ref1;
while (<$ref1_fh>) {
    chomp;
    next if m/ID/;
    my ( $key, $value ) = split;
    my $zeropadded = sprintf( "%03d", $key );
    my ($firstletter) = ( $value =~ m/^(\w)/ );
    push( @{ $ref1{$zeropadded}{$firstletter} }, $value );

}

print Dumper \%ref1;

print join( "\t", "ID1", "ID2", "ID3" ), "\n";
foreach my $filename ( glob("number*.txt") ) {
    my ($ref_num) = ( $filename =~ m/number(\d+)/ );
    open( my $input, "<", $filename ) or warn $!;
    while (<$input>) {
        chomp;
        my ( $key, $value ) = split;
        my ($firstletter) = ( $key =~ m/^(\w)/ );
        if ( defined $ref1{$ref_num}{$firstletter}
            and @{ $ref1{$ref_num}{$firstletter} } )
        {
            my $refkey = pop( @{ $ref1{$ref_num}{$firstletter} } );

            print join( "\t", int $ref_num, $refkey, $value ), "\n";
        }
    }
    close($input);
}

我已将“ref”数字转换为零填充,因此它直接匹配文件名,因为您指定的文件名是number001.txt匹配1 in ref1.

我还要插入以下内容$ref1进入数组的哈希值,键入您要查找的第一个字母 - 弹出“查找”值直到为空。

因此我们得到:

ID1 ID2 ID3
1   HY  5
1   HX  4
1   HZ  7
2   C   9
2   HZ  11
2   N   0
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Perl 中,参考文件和一系列文件之间的映射 的相关文章

  • perl:正确的“内容类型”格式以返回“图像数据 uri”

    我有一个模板angularjs期待着image data uri由通过调用的服务器调用返回src的属性img模板的元素 img width 200px height 200px src http localhost 3000 returni
  • 在 Perl 中查找标量变量的数据类型

    我有一个接受用户输入的函数 输入可以是整数 浮点数或字符串 我有三个重载函数 应该根据输入数据的数据类型调用它们 例如 如果用户输入一个整数 比如100 则应该调用具有整数参数的函数 如果用户输入字符串 例如 100 则应调用具有字符串参数
  • 如何在 Perl 中的不同包之间共享全局值?

    是否有一种标准方法可以对模块进行编码以保存要包含在每个其他包中的全局应用程序参数 例如 use Config 一个简单的包 只包含our变量 只读变量怎么样 已经有一个标准配置模块 http perldoc perl org Config
  • “get”在 Perl 中不起作用

    我是 Perl 新手 在过去的几天里 我制作了一些简单的脚本 通过 get 将网站的源代码保存到我的计算机上 他们做了他们应该做的事情 但不会获得论坛网站的内容 非论坛网站工作得很好 知道发生了什么事吗 这是问题块 my url http
  • 无法在 Mac 上安装 DBD::mysql

    第一次发帖 格式可能不太对 请见谅 我一直在尝试使用 cpan 在 macOS Catalina 上安装 DBD mysql 但尚未成功 我使用了perlbrew 并尝试了mysql和mariaDB 但仍然没有成功 另外 我在网上研究了不同
  • 如何将 cpanminus 与本地 CPAN::Mini 一起使用?

    我已经创建了自己的 CPAN 本地副本minicpan http search cpan org rjbs CPAN Mini 1 111007 bin minicpan并设法重新配置 cpan 来使用它 太棒了 但是我将如何使用它cpan
  • 在 Perl 中组装 XML

    我需要对 NetApp 文件管理器进行 API 调用 我知道我需要发送什么原始 XML
  • Perl 构建、单元测试、代码覆盖率:一个完整​​的工作示例

    我找到的关于 Perl 构建过程 单元测试和代码覆盖率的大多数 Stackoverflow 答案都只是将我指向 CPAN 那里的文档 指向 CPAN 模块绝对没有任何问题 因为完整的文档应该位于此处 不过 在很多情况下 我很难找到完整的工作
  • Perl - 以相反的顺序逐行读取文件[重复]

    这个问题在这里已经有答案了 可能的重复 如何在 Perl 中从文件末尾读取行 https stackoverflow com questions 303053 how can i read lines from the end of fil
  • 如何检测已更改的网页?

    在我的应用程序中 我使用 LWP 定期获取网页 无论如何 是否要检查两次连续提取之间网页是否在某些方面发生了变化 除了明确进行比较之外 是否有在较低协议层生成的任何签名 例如 CRC 可以提取并与旧签名进行比较以查看可能的更改 有两种可能的
  • Perl 删除目录中的所有文件

    我怎样才能删除allPerl 中目录中的文件 不删除目录 我的主机只允许最多 250 000 个 文件 而我的 tmp 文件夹会在所有会话 cookie 运行的情况下快速填充 250 000 个 qouta 在这种情况下我无法删除 tmp
  • Perl 中如何释放内存?

    我的代码如下所示 my var my var new while 1 while my k v each var a sub v var A map var var new keys var new var new B sub a sub
  • 如何在正则表达式中匹配“/*”?

    stuff d learning perl tmp txt open STUFF stuff or die Cannot open stuff for read while
  • 使用perl,在每行都有相同单词的情况下如何选择最后两行?

    Bini 21 89753 20 47853 20 27835 18 34952 16 23454 Bini 16 89753 14 47853 13 27835 12 34952 11 23454 Bini 10 09014 我的文件有一
  • Path::Class::File 或 ::Dir & Moose 初始化和强制

    目前有 package Local use warnings use Moose use Method Signatures Simple use Path Class File use Path Class Dir method buil
  • Perl 和 Unix 如何以相同的顺序对 Unicode 字符串进行排序?

    我正在尝试获取 Perl 和 GNU Linuxsort 1 程序就如何对 Unicode 字符串进行排序达成一致 我在跑sort with LANG en US UTF 8 在Perl程序中我尝试了以下方法 use Unicode Col
  • 根据插入顺序迭代哈希?

    不想对条目进行排序 使用它也不会保留顺序 foreach my val keys hash 默认情况下 Perl 5 中的哈希值是无序的 您可以使用tie http perldoc perl org functions tie html a
  • 在 Google 表格应用程序中进行身份验证

    我有一个类似批处理的应用程序 由调度程序定期调用 无需人类用户参与 它使用 PerlNet Google 电子表格 http metacpan org pod Net Google Spreadsheets包通过从数据库获取的数据来更新 G
  • 当值相同时,为什么我的值比较返回 false?

    我有一个 perl 脚本 可以将 Excel XLS 文件中的数据加载到数据库中 首先 它检查文件中的值的日期时间是否已存在于数据库中 如果是 它会检查文件中的值是否与数据库中的值相同 如果它们相同 则跳过该值 如果不同 则更新数据库中的值
  • 在 Perl 中如何用空格填充字符串的一部分?

    你更喜欢哪个版本 usr bin env perl use warnings use strict use 5 010 my p 7 33 my prompt my key very important text my value Hell

随机推荐