2016-08-19 7 views
0

私は会社の識別子、2桁の年、ランダムな数字のセット(例: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

解析コンポーネントのファイル名、-に分割することで言うと、あなたは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*"; 

のみ最初の2つのフィールドは、splitから求められます。昨年のファイル名は、これら2つのコンポーネントを一意にするために、これらのコンポーネントをグロブすることによって完成されます。同じ方法で始まる名前の他のエントリがある場合は、globからの戻り値を処理する必要があります。 globはリスト(ここでは1つの要素)を返すので、その(sole)ファイル名の周りに()が必要です。

+0

ありがとうございます。 3つ目のコンポーネント($ rest)は、今年の出願と昨年の出願とでは異なるため、3つのコンポーネントに参加しても、前年の出願はできません。これはどうですか?私はすべてのファイル名のうち最後のコンポーネントを削除しようとすることができると思うので、これはもはや問題ではありませんが、私はそうしたくありません。 – Rick

+0

@Rickああ、わかりました - しかし、最初の2つのコンポーネントは依然として昨年のファイル名を一意に決定しますか?はいの場合は、「安静」が簡単に見つかる必要があります。私はそれを修正するつもりだ(私は彼らが異なっていることを今見て、私は見ていない申し訳ありません) – zdim

+0

@Rick修正。残りの質問 - ファイル名のベース( 'join ' - '、$ comp_id、$ year')は、去年の希望のファイル名である1つのエントリだけにマッチします。そのような方法で始まる名前を持つ他のファイル/ディレクトリがある場合、 'glob'が返すようにgrepするか、それ以外の場合はさらに処理します。 – zdim

関連する問題