0

我有一批年度公司文件,每个文件都使用以下格式命名:公司标识符、两位数年份和一组随机数字(例如,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###
4

1 回答 1

1

解析组件的文件名,例如通过拆分 on -,然后您可以将年份减 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*";

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

于 2016-08-19T18:57:54.703 回答