【问题标题】:Reading in document with similar filename from directory从目录中读取具有相似文件名的文档
【发布时间】:2016-12-27 00:22:46
【问题描述】:

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

【问题讨论】:

    标签: perl directory matching file-find


    【解决方案1】:

    解析组件的文件名,例如拆分-,然后您可以将年份减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 的返回。由于glob 返回一个列表(这里只有一个元素),我们需要() 围绕该(唯一)文件名。

    【讨论】:

    • 感谢您的回复。第三部分($rest)在今年的申请和去年的申请中会有所不同,所以加入这三个部分不会给我上一年的申请。有什么办法吗?我想我可以尝试从所有文件名中删除最后一个组件,所以这不再是问题,但我不想这样做。
    • @Rick 啊,我明白了——但是前两个组件仍然唯一地确定去年的文件名吗?如果是,则需要找到“其余”,这很容易。我会解决这个问题(我现在看到它们是不同的,抱歉我没看)
    • @Rick 已修复。剩下的问题——我认为文件名的基础 (join '-', $comp_id, $year) 将只匹配一个条目,即去年所需的文件名。如果有其他文件/目录的名称以这种方式开始,您希望grep 返回globs,或者进一步处理它。
    • 是的,前两个组件唯一地确定了去年的文件名。
    猜你喜欢
    • 2023-03-03
    • 2014-06-07
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    • 2015-09-19
    相关资源
    最近更新 更多