【问题标题】:Perl merging columns in two text filesPerl合并两个文本文件中的列
【发布时间】:2023-04-08 13:47:01
【问题描述】:

我是 Perl 的初学者,我想合并两个文本文件的内容。 我在这个论坛上阅读了一些类似的问题和答案,但我仍然无法解决我的问题 第一个文件具有每个人的原始 ID 和重新编码的 ID(在第一列和第四列中) 第二个文件包含重新编码的 ID 和一些个人的一些信息(在第一列和第二列中)。 我想用这些人的原始、重新编码和信息创建一个输出文件。 这是我到目前为止创建的 perl 脚本,它不起作用。 如果有人可以提供帮助,将不胜感激。

use warnings;
use strict;
use diagnostics;
use vars qw( @fields1 $recoded $original $IDF @fields2); 
my %columns1;

open (FILE1, "<file1.txt") || die "$!\n Couldn't open file1.txt\n";
while ($_ = <FILE1>)
{
    chomp;
    @fields1=split /\s+/, $_;

    my $recoded = $fields1[0];
    my $original = $fields1[3];
    my %columns1 = (
    $recoded => $original
    );
};

open (FILE2, "<file2.txt") || die "$!\n Couldnt open file2.txt \n";
for ($_ = <FILE2>)
{
    chomp;
    @fields2=split /\s+/, $_;
    my $IDF= $fields2[0];
    my $F=$fields2[1];
    my %columns2 = (
    $F => $IDF
    );  
};

close FILE1;
close FILE2;


open (FILE3, ">output.txt") ||die "output problem\n";

    for (keys %columns1) {
        if (exists ($columns2{$_}){
        print FILE3 "$_     $columns1{$_}\n" 
        };
    }

close FILE3;

【问题讨论】:

    标签: perl text hash merge key


    【解决方案1】:

    一个问题是范围界定。在您的第一个循环中,$column1 前面有一个 my,这使它成为循环的本地对象,并且在您下一个循环时将不在范围内。所以%columns1(在循环之外)没有设置任何值(这是我怀疑你想要设置的)。对于分配,使用 $columns1{$recorded} = $original; 将值分配给哈希键似乎更容易。

    在第二个循环中,您需要在循环外声明%columns2,并可能使用上述赋值。

    对于第三个循环,在打印中,您只需在要打印的字符串前面添加$columns2{$_},即可在记录的ID之前得到要打印的原始ID。

    【讨论】:

      【解决方案2】:
      • 范围:

      问题在于您定义的散列变量的范围。 变量的范围仅限于定义变量的循环

      在您的代码中,因为 %columns1 和 %columns2 在 while 循环之外使用。因此,它们应该在循环之外定义。

      • 编译错误:大括号未正确闭合

      另外,在“如果存在”部分,开闭大括号对称性受到影响。

      这是您的代码,并进行了必要的更正:

      use warnings;
      use strict;
      use diagnostics;
      use vars qw( @fields1 $recoded $original $IDF @fields2);
      my (%columns1, %columns2);
      
      open (FILE1, "<file1.txt") || die "$!\n Couldn't open CFC_recoded.txt\n";
      while ($_ = <FILE1>)
      {
          chomp;
          @fields1=split /\s+/, $_;
      
          my $recoded = $fields1[0];
          my $original = $fields1[3];
          %columns1 = (
          $recoded => $original
          );
      }
      
      open (FILE2, "<file2.txt") || die "$!\n Couldnt open CFC_F.xlsx \n";
      for ($_ = <FILE2>)
      {
          chomp;
          @fields2=split /\s+/, $_;
          my $IDF= $fields2[0];
          my $F=$fields2[1];
          %columns2 = (
          $F => $IDF
          );
      }
      
      close FILE1;
      close FILE2;
      
      
      open (FILE3, ">output.txt") ||die "output problem\n";
      
          for (keys %columns1) {
              print FILE3 "$_ $columns1{$_} \n" if exists $columns2{$_};
      
          }
      
      close FILE3;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-01-29
        • 1970-01-01
        • 1970-01-01
        • 2011-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多