Как открыть / объединить более одного файла (в зависимости от ввода пользователя), а затем использовать 2 файла одновременно - PullRequest
1 голос
/ 07 июня 2011

РЕДАКТИРОВАТЬ: Извините за недоразумение, я отредактировал несколько вещей, надеюсь, на самом деле запросить то, что я хочу.

Мне было интересно, есть ли способ открыть / объединить два или более файлов для запускаОстальная часть программы включена.

Например, в моем каталоге находятся следующие файлы:

taggedchpt1_1.txt, parsedchpt1_1.txt, taggedchpt1_2.txt, parsedchpt1_2.txt и т. д.

Программа должна вызывать теги и анализироваться одновременно.Я хочу запустить программу как на chpt1_1, так и на chpt1_2, желательно объединить их в один файл .txt, если это не будет слишком медленным.Например, запустите то, что было бы достигнуто, имея два файла:

taggedchpt1_1_and_chpt1_2 и parsedchpt1_1_and_chpt1_2

Можно ли это сделать через Perl?Или я должен просто объединить текстовые файлы сам (или автоматизировать этот процесс, создавая chpt1.txt, который будет включать chpt1_1, chpt1_2, chpt1_3 и т. Д ...)

#!/usr/bin/perl
use strict;
use warnings FATAL => "all";
print "Please type in the chapter and section NUMBERS in the form chp#_sec#:\n"; ##So the user inputs 31_3, for example
chomp (my $chapter_and_section = "chpt".<>);
print "Please type in the search word:\n";
chomp (my $search_key = <>);

open(my $tag_corpus, '<', "tagged${chapter_and_section}.txt") or die $!;
open(my $parse_corpus, '<', "parsed${chapter_and_section}.txt") or die $!;

, чтобы остальная часть программы работала,Мне нужно иметь возможность:

my @sentences = <$tag_corpus>; ##right now this is one file, I want to make it more
my @typeddependencies = <$parse_corpus>; ##same as above

EDIT2 : очень сожалею о недоразумении.В программе, после показанных шагов, я делаю 2 для циклов.Читаем строки с тегами и разбираем.

Я хочу сделать это с помощью большего количества файлов из того же каталога, без повторного ввода следующих файлов.(т.е. я могу запустить taggedchpt31_1.txt и parsedchpt31_1.txt ...... Я хочу запустить taggedchpt31 и parsedchpt31 - который включает в себя ~ chpt31_1, ~ chpt31_2 и т. д ...)

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

Извините и спасибо за ваше время!Посмотрите на разбивку моего вопроса FMC для получения дополнительной помощи.

Ответы [ 3 ]

4 голосов
/ 07 июня 2011

Вы можете перебирать имена файлов, открывая и читая каждое из них по очереди.Или вы можете создать итератор, который знает, как читать строки из последовательности файлов.

sub files_reader {
    # Takes a list of file names and returns a closure that
    # will yield lines from those files.
    my @handles = map { open(my $h, '<', $_) or die $!; $h } @_;
    return sub {
        shift @handles while @handles and eof $handles[0];
        return unless @handles;
        return readline $handles[0];
    }
}

my $reader = files_reader('foo.txt', 'bar.txt', 'quux.txt');

while (my $line = $reader->()) {
    print $line;
}

Или вы можете использовать встроенный итератор Perl, который может делать то же самое:

local @ARGV = ('foo.txt', 'bar.txt', 'quux.txt');
while (my $line = <>) {
    print $line;
}

Отредактируйте в ответ на последующие вопросы:

Возможно, это поможет разбить вашу проблему на более мелкие подзадачи.Насколько я понимаю, у вас есть три шага.

  • Шаг 1 состоит в получении некоторого ввода от пользователя - возможно, имени каталога или пары шаблонов имен файлов (taggedchpt и parsedchpt).

  • Шаг 2 для программы, чтобы найти все соответствующие имена файлов.Для этой задачи могут быть полезны glob() или readdir().Есть много вопросов по StackOverflow, связанных с такими проблемами.Вы получите два списка имен файлов, один для помеченных файлов и один для проанализированных файлов.

  • Шаг 3 - обработка строк во всех файлах в каждом из двух наборов.Большинство полученных вами ответов, включая мои, помогут вам на этом этапе.

3 голосов
/ 07 июня 2011

Никто еще не упомянул взломать @ARGV? Хорошо, вот оно.

{
    local @ARGV = ('taggedchpt1_1.txt', 'parsedchpt1_1.txt', 'taggedchpt1_2.txt',  
                   'parsedchpt1_2.txt');
    while (<ARGV>) {
       s/THIS/THAT/;
       print FH $_;
    }
}

ARGV - это специальный файловый дескриптор, который перебирает все имена файлов в @ARGV, закрывая файл и открывая следующий при необходимости. Обычно @ARGV содержит аргументы командной строки, которые вы передали perl, но вы можете установить для него любое значение.

3 голосов
/ 07 июня 2011

Вы почти там ... это немного эффективнее, чем дискретное открытие каждого файла ...

#!/usr/bin/perl
use strict;
use warnings FATAL => "all";
print "Please type in the chapter and section NUMBERS in the for chp#_sec#:\n";
chomp (my $chapter_and_section = "chpt".<>);
print "Please type in the search word:\n";
chomp (my $search_key = <>);

open(FH, '>output.txt') or die $!;   # Open an output file for writing
foreach ("tagged${chapter_and_section}.txt", "parsed${chapter_and_section}.txt") {
    open FILE, "<$_" or die $!;      # Read a filename (from the array)
    foreach (<FILE>) {
       $_ =~ s/THIS/THAT/g;   # Regex replace each line in the open file (use 
                              #     whatever you like instead of "THIS" &
                              #     "THAT"
       print FH $_;           # Write to the output file
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...