编写文件并在 Perl 中读取它

  • 本文关键字:读取 Perl 文件 perl
  • 更新时间 :
  • 英文 :


我正在尝试将主键从具有以下结构(tbl_20180615.txt(的原始文件构建到新文件中:

573103150033,0664,54,MSS02VEN*',INT,zxzc,,,,,
573103150033,0665,54,MSS02VEN,INT,zxzc,,,,,
573103150080,0659,29,MSS05ARA',INT,zxzc,,,,,
573103150080,0660,29,MSS05ARA ,INT,zxzc,,,,,
573103154377,1240,72,MSSTRI01,INT,zxzc,,,,,
573103154377,1240,72,MSSTRI01,INT,zxzc,,,,,

我启动我的perl Verify.pl然后发送参数,第一个是在新文件中构建主键的列数,在我必须发送文件名(原始文件(之后。

(Verify.pl(

#!/usr/bin/perl
use strict;
use warnings;
my $n1   = $ARGV[0];
my $name = $ARGV[1];
$n1 =~ s/"//g;
my $n2 = $n1 + 1;
my %seen;
my ( $file3 ) = qw(log.txt);
open my $fh3, '>', $file3 or die "Can't open $file3: $!";
print "Loading file ...n";
open( my $file, "<", "$name" ) || die "Can't read file somefile.txt: $!";
while ( <$file> ) {
chomp;
my @rec = split( /,/, $_, $n2 );    #$n2 sirve para armar la primary key, hacer le split en los campos deseados
for ( my $i = 0; $i < $n1; $i++ ) {
print $fh3 "@rec[$i],";
}
print $fh3 "n";
}
close( $file );
print "Done!n";
######to 检查重复项
my ($file4) = qw(log.txt);
print "Checking duplicates records...nn";
open (my $file4, "<", "log.txt") || die "Can't read file log.txt: $!";
while ( <$file4> ) { 
print if $seen{$_}++;
}
close($file4);

如果我发送以下指令

perl Verify.pl 2 tbl_20180615.txt

此代码使用以下结构构建一个名为"log.txt"的新文件,将原始文件((拆分为第一个参数给出的两列: (日志.txt(

573103150033,0664,
573103150033,0665,
573103150080,0659,
573103150080,0660,
573103154377,1240,
573103154377,1240,

这工作正常,但是如果我想读取新文件log.txt检查重复项,则不起作用,但是如果我注释log.txt代码中行(#####to#(启动代码的下一部分,它工作正常,给我两个重复的行,看起来像这样: (在命令行中生成(

573103154377,1240
573103154377,1240

如何解决此问题?

我认为这符合您的要求。它在打印任何派生密钥之前构建一个唯一的派生密钥列表,使用哈希来检查是否已生成密钥

请注意,我已将值分配给@ARGV以模拟输入值。在使用命令行输入运行程序之前,必须删除该语句

#!/usr/bin/perl
use strict;
use warnings;
use autodie;  # Handle bad IO statuses automatically
local @ARGV = qw/ 2 tbl_20180615.txt /; # For testing only
tr/"//d for @ARGV;  # "
my ($key_fields, $input_file) = @ARGV;
my $output_file = 'log.txt';
my (@keys, %seen);
print "Loading input ... ";
open my $in_fh, '<', $input_file;
while ( <$in_fh> ) {
chomp;
my @rec = split /,/;
my $key = join ',', @rec[0..$key_fields-1];
push @keys, $key unless $seen{$key}++;
}
print "Donen";
open my $out_fh, '>', $output_file;
print $out_fh "$_n" for @keys;
close $out_fh;

输出log.txt

573103150033,0664
573103150033,0665
573103150080,0659
573103150080,0660
573103154377,1240

最新更新