Perl - оптимальный способ обработки множества одноименных текстовых файлов - PullRequest
1 голос
/ 19 февраля 2011

У меня есть несколько тысяч текстовых файлов в каталоге, который мне нужно обработать.С таким же именем, но с некоторыми вариациями:

/home/dir/abc123.name.efg-joe_p000.20110124.csv
/home/dir/abc456.name.efg-jon_p000.20110124.csv
/home/dir/abc789.name.efg-bob_p000.20110124.csv

У меня есть Perl-скрипт, который может без проблем обрабатывать один файл за раз:

./script.pl /home/dir/abc123.name.efg-joe_p000.20110124.csv

Какой лучший способ передатьи обрабатывать многие из этих файлов по одному?Я смотрю на ARGV для этого?Должен ли я перечислить файлы в отдельный файл, а затем использовать его в качестве входных данных?

Ответы [ 3 ]

4 голосов
/ 19 февраля 2011

Если под «оптимальным» вы подразумеваете «без изменений кода» и, как подсказывают ваши пути, в * NIX-подобной системе, попробуйте следующее:

$ find /home/dir -type f -name \*.csv -exec ./script.pl {} \;

Если script.pl можетобрабатывать несколько аргументов имени файла, вы можете распараллелить, скажем, 10 одновременно:

$ find /home/dir -type f -name \*.csv | xargs -n 10 ./script.pl
4 голосов
/ 19 февраля 2011

Вы можете передать шаблон файла в качестве параметра (глобальный формат), а затем передать его в glob вызов для просмотра списка файлов;затем обработайте их в цикле один за другим.

./script.pl -file_pattern "/home/dir/abc123.name.efg-joe_p000.*.csv"

В вашем скрипте

my @files = glob($file_pattern);
2 голосов
/ 19 февраля 2011

Вы можете использовать readdir для чтения имен файлов по одному:

opendir my $dh, $some_dir or die "can't opendir $some_dir: $!";

while (defined(my $file = readdir($dh))) {
    next if $file =~ /^\./;
    print $file;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...