2014-10-31 13 views
-1

Я хочу разбить большой файл на маленькие файлы, разделив его на определенную строку с помощью регулярного выражения. Любая помощь? Мой код выполняет работу, но также создает пустой файл.Избегайте создания пустого файла

#!/usr/local/lib/perl/5.14.2 

open(INFILE, 'test.txt'); 
@lines = <INFILE>; 
$file = "outfile"; 
for ($j = 0; $j <= $#lines; $j++) { 
    open(OUTFILE, ">", $file . $j); 
    $file_name = $file . $j; 
    #print "file is $file_name\n"; 
    $i = 0; 
    while (@lines) { 
     $_ = shift @lines; 
     chomp; 
     $i++; 
     if ($_ =~ /^###\s*(.*)\s*###/ && $i > 1) { 
      unshift @lines, "$_\n"; 
      print "$filename\n"; 
      last; 
     } 
     print OUTFILE "$_\n"; 
    } 
    close(OUTFILE); 
} 
close(INFILE); 

Мой входной файл содержит:

------------- 
### abcd hdkjfkdj #### 
body 1 dsjklsjdfskl 
### zyz fhid ### 
abcdksdsd djnfkldsfmnsldk ;lkjfkl 
--------------------------- 

он создает 3 outfiles называемые outfile0, outfile1, outfile2. но outfile0 пуст Я хочу этого избежать.

+1

Ну как мы знаем, что не так с вашим кодом, пока мы его не увидим? –

+0

Я пытаюсь добавить свой код, но система не позволяет мне. –

+0

Какая система? Вы имеете в виду StackOverflow? Просто отредактируйте сообщение и вставьте код. –

ответ

3

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

Вот переписывание, которое работает. Я также удалил временный массив @ строк

#!/usr/bin/perl 
# 
use warnings; 
use strict; 

open(my $file,"<", "test.txt") || die $!; 
my $counter=1; 
my $out; 

while(<$file>) { 
    if (/###\s*(.*)\s*###/) { 
    open($out, ">", "outfile$counter") || warn "outfile$counter $!"; 
    $counter++; 
    } 
    print $out $_ if $out; 
} 
+0

Спасибо, ребята, можем ли мы переименовать oufile0 ... и т. Д. Или назвать сгенерированные файлы значением eregex- $ 1 в условии if? if (/####s*(.*)\s*###/) { в вышеприведенном (. *) -> $ 1 можно ли назвать файл значением $ 1? –

+0

У меня есть именование файлов, еще одно сомнение. можем ли мы использовать несколько условий в функции расщепления? –

+0

вы можете использовать $ 1, чтобы назвать файл? Да «можем ли мы использовать несколько условий»? Не уверен, что вы имеете в виду. Сделайте еще один вопрос SO – Vorsprung

0

Если вы хотите использовать материал между ### блоками, как названия файлов, вы можете задать имя файла, когда вы делаете поиск по шаблону на линиях с ### блоки.

#!/usr/bin/perl 
use strict; 
use warnings; 

open my $fh, '<', 'my_file.txt' or die "Could not open file: $!"; 

# initialise a variable that will hold the output file handle 
my $out; 
while (<$fh>) { 
    # capture the title between the # signs 
    if (/##+ (.*?) ##+/) { 
     open $out, '>', $1.".txt" or die "Could not create file $1.txt: $!"; 
    } 
    elsif ($out) { 
     print $out $_; 
    } 
    else { 
     # if $out is not set, we haven't yet encountered a title block 
     warn "Error: line found with no title block: $_"; 
    } 
} 

Пример ввода:

Text files containing their own name 
### questions-1 #### 
Why are a motorcycle's front brakes more effective than back? 
Is it possible to make a gradient follow a path in Illustrator? 
Text files containing their own name 
### questions-2 ### 
Why does Yoda mourn the Jedi after order 66 is executed? 
what are the standard gui elements called? 
Flybe just cancelled my return flight. Will they refund that part of the trip? 
### questions-3 ### 
Merge two arrays of ElementModels? 
Is this set open or closed? 

Выход: три файла, questions-1.txt, questions-2.txt, questions-3.txt, содержащие соответствующие строки. например вопросы-1.txt:

Why are a motorcycle's front brakes more effective than back? 
Is it possible to make a gradient follow a path in Illustrator? 
Text files containing their own name 

Вы не указано, желаете ли вы ### линии на выходе или нет, поэтому я оставил их.

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