【问题标题】:How can match records in two files using Perl?如何使用 Perl 匹配两个文件中的记录?
【发布时间】:2011-02-10 17:07:02
【问题描述】:

我有两个文件,CUSTOMER_ACCOUNT_LOG.TXT,CUSOMER_ID_LOG.TXT。

这是日志,维护时间戳和帐户ID,就像在另一个文件中的时间戳和customerid一样,

简单,我想选择具有匹配 TIMESTAMP 的 AccountID 和 CustomerID,

例如,123456793 是 TIMESTAMP,对于这个 Equlent 匹配记录是 ABC0103,CUSTOMER_ID_0103,

像这样我想选择详细的,需要将这些匹配的记录写入另一个文件,

CUSOMER_ACCOUNT_LOG.TXT

TIMESTAMP| N1| N2 |ACCOUNT ID
-----------------------------------
123456789,111,1000,ABC0101
123456791,112,1001,ABC0102
123456793,113,1002,ABC0103
123456795,114,1003,ABC0104
123456797,115,1004,ABC0105
123456799,116,1005,ABC0106
123456801,117,1006,ABC0107
123456803,118,1007,ABC0108
123456805,119,1008,ABC0109
123456807,120,1009,ABC0110
123456809,121,1010,ABC0111
123456811,122,1011,ABC0112
123456813123,1012,ABC0113
123456815,124,1013,ABC0114
123456817,125,1014,ABC0115
123456819,126,1015,ABC0116
123456821,127,1016,ABC0117
123456823,128,1017,ABC0118
123456825,129,1018,ABC0119
123456827,130,1019,ABC0120
123456829,131,1020,ABC0121

CUSOMER_ID_LOG.TXT

TIMESTAMP| N1| N2 | CUSTOMER ID
-----------------------------------
123456789,111,1000,CUSTOMER_ID_0101
123456791,112,1001,CUSTOMER_ID_0102
123456793,113,1002,CUSTOMER_ID_0103
123456795,114,1003,CUSTOMER_ID_0104
123456797,115,1004,CUSTOMER_ID_0105
123456799,116,1005,CUSTOMER_ID_0106
123456801,117,1006,CUSTOMER_ID_0107
123456803,118,1007,CUSTOMER_ID_0108
123456805,119,1008,CUSTOMER_ID_0109
123456807,120,1009,CUSTOMER_ID_0110
123456809,121,1010,CUSTOMER_ID_0111
123456811,122,1011,CUSTOMER_ID_0112
123456813123,1012,CUSTOMER_ID_0113
123456815,124,1013,CUSTOMER_ID_0114
123456817,125,1014,CUSTOMER_ID_0115
123456819,126,1015,CUSTOMER_ID_0116
123456821,127,1016,CUSTOMER_ID_0117
123456823,128,1017,CUSTOMER_ID_0118
123456825,129,1018,CUSTOMER_ID_0119
123456827,130,1019,CUSTOMER_ID_0120
123456829,131,1020,CUSTOMER_ID_0121

我是一名 PHP 程序员,并且是 Perl 的新手。

首先我读取文件,然后我只是制作数组,现在我的数组包含时间戳其余所需的详细信息,实际上应该知道什么?我们应该读取文件并将值填充到数组中,所以猜测,数组键应该包含帐户 ID,数组值应该包含时间戳,反之不确定,就像另一个文件一样,最后我们应该比较时间戳,哪些时间戳匹配然后时间戳帐户id 和 customer id 我们应该选择,据我所知,我填充了数组,现在我不知道如何进一步进行,因为,这里应该使用 foreach,然后需要匹配 noth 文件时间戳,我卡在这里!

【问题讨论】:

    标签: perl


    【解决方案1】:

    以下是我将采取的步骤:

    0) 一些基本的 Perl 样板(这是第 0 步,因为您应该始终这样做,有些人会在这个样板中添加其他东西,但这是最低限度的):

    use strict;
    use warnings;
    use 5.010;
    

    1) 将第一个文件读入以时间戳为键的散列中:

    my %account;
    open( my $fh1, '<', $file1 ) or die "$!";
    while( my $line = <$fh1> ) {
      my @values = split ',', $line;
      $account{$values[0]} = $values[3];
    }
    close $fh1;
    

    2) 读取第二个文件,每读取一行,拉出时间戳,然后将时间戳、账户ID、客户ID打印到一个新文件中。

    open( my $out_fh, '>', $outfile ) or die "$!";
    open( my $fh2, '<', $file2 ) or die "$!";
    while( my $line = <$fh2> ) {
      my @values = split ',', $line;
      say $out_fh join ',', $values[0], $account{$values[0]}, $values[3];
    }
    close $out_fh;
    close $fh2;
    

    您不想将整个文件读入数组,因为这会浪费内存。只存储您需要的信息,并利用 Perl 的数据类型来帮助您存储这些信息。

    【讨论】:

    • 别忘了跳过标题行。
    • 对于实施解决方案的人来说,这是一个非常微不足道的补充。
    猜你喜欢
    • 1970-01-01
    • 2020-05-09
    • 2015-08-16
    • 2021-09-08
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    • 2020-04-16
    • 2014-02-21
    相关资源
    最近更新 更多