从目录中读取具有相似文件名的文档

Reading in document with similar filename from directory

我有一批年度公司文件,每份文件都使用以下格式命名:公司标识符、两位数年份和一组随机数字(例如,00000217-12-00010.txt)。我想将每个年度申报的内容与同一公司在上一年提交的申报进行比较(例如,000002178-13-00010.txt 与 000002178-12-00005.txt 相比)。当我遍历每个文件时,如何识别每个文件的前一年的归档,以便我可以将两个文件作为单独的字符串读取?

use strict ;
use warnings ;
use autodie ;
use File::Find  ;

### BEGIN BY READING IN EACH FILE ONE BY ONE. ###
################## LOOP BEGIN ##################
# Process every file with a `txt` file type

my $parent = "D:/Cleaned 10Ks" ;
my ($par_dir, $sub_dir);
opendir($par_dir, $parent);

while (my $sub_folders = readdir($par_dir)) {
next if ($sub_folders =~ /^..?$/);  # skip . and ..
my $path = $parent . '/' . $sub_folders;
next unless (-d $path);   # skip anything that isn't a directory
chdir($path) or die "Cant chdir to $path $!";

for my $filename ( grep -f, glob('*') ) {
#### FIND THE PRIOR YEAR'S CORRESPONDING FILING AND READ BOTH IN AS STRINGS###

解析组件的文件名,比如在 - 上拆分,然后您可以将年份减 1 并重新组合名称。障碍是日期——如果年份是 00,你不能只减去 1。正确的方法是使用日期模块,但由于 00 是你唯一可以做的棘手情况手动。

my ($comp_id, $year) = split '-', $filename;

my $prev_year = ($year ne '00') ? $year - 1 : 99;

my $prev_year_base   = join '-', $comp_id, $year;

my ($prev_year_file) = glob "$prev_year_base*";

split 仅要求前两个字段,因为文件之间的其余部分不同。去年的文件名是通过遍历这两个组件来完成的,以使其独一无二。如果可能有其他名称以相同方式开头的条目,则应处理 glob 中的 return。由于 glob return 是一个列表(这里只有一个元素),我们需要 () 围绕那个(唯一的)文件名。