我导出了一些文件,并且在导出后实际上缺少了2个文件。 在报告中写道,我导出了260个文件,但我只有258个文件。

现在我要检查哪个文件丢失。 因此,我决定使用Perl脚本进行尝试,甚至对此还不是很新鲜。

导出协议看起来像这样...

DATEDATEDATE-USER EXPORT,计数器“ 0000000001”:对象:“ FILENAME”已导出。 DATEDATEDATE-用户导出。 文件:“ D:\\ Work \\ Export_Import \\ Export \\ FILENAME.xml”已导出。

唯一重要的是文件名:]

谢谢!

编辑:解决了。 向下滚动:]

#1楼 票数:0

您问题的根源是这一行:

$Expo = $Export . $_;

您正在将所有文件名串联到一个标量中,这不能很好地工作。 因为那里永远只有最后一个……尤其是如果$Export是目录,则您尝试将其作为文件打开。

我可以建议使用File::Find吗? 有点像这样:

#!C:\Strawberry\perl\bin\perl.exe

#Pragmas
use strict;
use warnings;

my %files_in_dir;
my %files_in_export;

my $dir_name    = '/path/to/dir';
my $export_name = 'filename_here';

sub find_files {
    if (-f) {
        $files_in_dir{$_} = $File::Find::name;
    }
}

find( \&find_files, $dir_name );

#Open Export File
open( my $datei, "<", "$export_name" ) or die $!;
while ( my $filename = <$datei> ) {
    chomp($filename);
    if ( $files_in_dir{$filename} ) {
        print "$filename in $files_in_dir{$filename}\n";
    }
    else {
        print "No $filename found\n";
    }
}
close($datei);

我还建议:

  • 使用3个参数打开,带有词法变量。

#2楼 票数:0

创建成功导出文件的哈希索引(假设所有文件都在一个目录中,并且完整路径并不重要):

my $dir = 'some/dir';
opendir my $dh, $dir;
my @files = readdir $dh;   
my %index;
$index{$_} = 1 foreach @files;

现在,遍历“协议”文件并捕获每行上导出的文件名。 使用该文件名来查看它是否作为您先前创建的哈希中的键存在。

# open your protocol file, then...
while (<$protocol_fh>) {
    my $exported = $1 if $_ =~ /([^\/]+\.xml)/;
    print "$exported was not found in $dir\n" if ! $index{$exported};
}

请注意,您将必须测试该正则表达式以从协议文件中捕获文件名,因为我尚未对其进行测试。

#3楼 票数:0

#Pragmas
use strict;
use warnings;

#Variablen
my $dir_name ='PathToDir';
my $export_name ='File.txt';

my $re1 = '.*?';
my $re2 = '((?:[a-z][a-z\\.\\d_]+)\\.(?:[a-z\\d]{3}))(?![\\w\\.])';
my @array1;
my @array2;
my $fqdn1;
my @diff;
my @isect;
my $item;
my %count;

#Open Report
open( my $fh, '<', $export_name )
  or die "Could not open file '$export_name' $!";

    while ( my $row = <$fh> ) {
    chomp $row;
    my $re = $re1 . $re2;
    if ( $row =~ m/$re/is ) {
        $fqdn1 = $1;

        if ( $fqdn1 =~ m/xml/ ) {
            push( @array1, $fqdn1 );
        }
    }

}
close($fh);

#Open Directory
opendir DIR, $dir_name;
@array2 = grep !/^\.\.?$/, readdir(DIR);
close(DIR);

#Searching the difference
@isect = ();
@diff  = ();
%count = ();

foreach $item ( @array1, @array2 ) { $count{$item}++; }

foreach $item ( keys %count ) {
    if ( $count{$item} == 2 ) {
        push @isect, $item;
    }
    else {
        push @diff, $item;
    }
}

#Output
print "Missing Filenames = @diff\n\n";

# print "\nA Array = @array1\n";
# print "\nB Array = @array2\n";
# print "\nIntersect Array = @isect\n";

我解决了 谢谢大家。

  ask by 0carina translate from so

未解决问题?本站智能推荐:

5回复

Perl,模式匹配数组中的每个元素($line)

我有一个简单的问题,我最近运行了一个脚本,该脚本从数组中每个元素的字符串中提取了特定信息。 我之前已经写过这个文件,但是它的功能很好,但是当现在尝试非常简单的版本时,它不会仅以相同的响应未初始化值参数来表示数据! 当我之前的代码工作时,我感到非常沮丧。 我显然在做一些愚蠢的事情,希望能有所
2回复

如何使用Perl的grep通过匹配名称中的模式来查找特定文件

我在Perl变量中存储了一个字符串,该字符串应与目录中存储的文件名的开头部分匹配。 我使用Perl的grep从目录中找到与该模式匹配的文件。 这是我在做什么: 首先,我得到文件夹f1中所有文件的列表,并将它们存储在数组@file 。 然后对于@file1每个条目,我提取前几个字符,将
1回复

计算单独IP条目PERL的频率

我有以下日志文​​件,我想输出文件中不同IP的频率: 这是我到目前为止提供的perl脚本,由@zdim 在上一篇文章中提供,并进行了如下所示的调整: 现在,输出如下所示,该输出适用于日志文件中的最后三个条目,因为IP最终被查看了3次: 我究竟做错了什么? 感谢您的帮助。 谢谢
2回复

通过将一个数组中的记录与Perl中另一个数组中的唯一名称列表进行匹配来创建单个文件

我有两个文件: 文件 1 包含一个唯一的名称列表,文件 2 包含一个带有附加数据的名称列表。 注意:文件 2 可以有多个同名记录。 例如: 文件 1:文件2:注意:ARRON LYNCH 在文件 2 中出现了 3 次。 我已经能够成功地将文件 1 和文件 2 加载到数组中以生成文件 3(请参阅下面的
1回复

用php在某些mysql行中查找模式

我在mysql中有一个带有2列的表:id(auto_increment)和value(int 0/1)。 我想找到与PHP表格中的模式“ 101”相匹配的状态。 例: 使用Array比通过mysql搜索模式(将mysql的值导入数组)要快得多? 任何机构都知道如何使用PHP查找整个行
2回复

在Perl中最有效的匹配数组元素的过程?

我有两个数组(Array1和Array2)。 Array1包含大约20,000个非唯一元素。 Array2包含大约90,000个唯一元素。 我试图计算Array1中也显示为Array2元素的元素的数量。 下面的perl脚本可以成功但缓慢地完成此操作。 是否还有另一种方法可以计算Arra
4回复

如何从数组中删除元素的特定区域

我想从数组中删除特定范围的元素。 我有一个txt文件: 我想做的是从文件中删除从单词“ Rbody”开始的元素,直到单词“ END”。 只删除单词Rbody的行...我想我需要一些循环。 :/ 感谢您的帮助。
2回复

Perl模式匹配数组

我想将我读取的字符串与可能的匹配数组进行匹配。 如果它可以返回匹配字符串的索引,那也将很好。 我可以很容易地对硬代码进行编码...也许这次会很方便,但是对于一般情况,我想看看是否可行。 我已经浏览了一些书籍和在线书籍(包括stackoverflow),但是找不到我想要的东西,也无法完全了解