0

会社の年次報告書のバッチがあり、それぞれ次の形式を使用して名前が付けられています: 会社 ID、2 桁の年、およびランダムな数字のセット (例: 00000217-12-00010.txt)。各年次提出書類の内容を、前年に同じ会社が提出した提出書類と比較したい (例: 000002178-12-00005.txt と比較した 000002178-13-00010.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

コンポーネントのファイル名を解析し、たとえば で分割する-と、年を 1 減らして名前を再構成できます。問題は日付です。年の場合、単純に001 を引くことはできません。適切な方法は、日付にモジュールを使用する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残りはファイル間で異なるため、 最初の 2 つのフィールドのみが from から求められます。昨年のファイル名は、これら 2 つのコンポーネントをグロビングすることによって完成され、一意になるように取られます。同じように始まる名前のエントリが他にある可能性がある場合は、からのリターンをglob処理する必要があります。globリスト (ここでは 1 つの要素) を返すため、その (唯一の) ファイル名が必要です()

于 2016-08-19T18:57:54.703 に答える