2013-03-07 3 views
2

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

Например:

Данные начинается с:

[TABLE] 

DATA........ 
DATA........ 

[/TABLE] 

[PAGE] 

[TABLE] 

DATA........ 
DATA........ 

[/TABLE] 

Желаемая Выход:

fILE1.TXT

DATA........ 
DATA........ 

file2.txt

DATA........ 
DATA........ 

Так в основном ничего между [TABLE] & [/TABLE] должен быть новый текстовый файл и так далее. И соглашение об именах для новых текстовых файлов может быть File1.txt, File2.txt и т. Д.

Пожалуйста, указывайте мне в правильном направлении.

Благодарим за помощь.

#!usr/bin/perl 
my $fi, $fi2; 
my $line; 
my $i; 
my @lines; 
my @filenameparts; 
my $filename = "file1.txt"; 

open($fi, "< complex.txt"); 
@lines = <$fi>; 
open ($fi2, " > $filename"); 

foreach (@lines) 
{ 
    if (($i > 0) and $_ =~ /[TABLE]/) 
{ 
      @filenameparts = split("_", $filename); 
      foreach (@filenameparts) 
      { 

      print "-----------------------------\n"; 
      print .$_; 
      print "-----------------------------\n";    
      } 
      @filenameparts[1] = substr(@filenameparts[1], 0,   @filenameparts[1].length() - 5); 
      @filenameparts[1] = ($filenameparts[1] + 1); 
      $filename = @filenameparts[0]."_"[email protected][1].".txt"; 
      print $filename; 
      close($fi2); 
      open ($fi2, " > $filename"); 
      $i = 0; 
      print $fi2 $_; 

    } 
    else 
    { 
     print $fi2 $_; 
    } 
    $i++; 

} 
+0

Я попробовал этот код, приведенный выше, и это только позволяет мне проникнуть в 5 текстовых файлов, когда я ожидаю 10. Кроме того, будет ли более эффективным способом и более короткий код для достижения такой же цели. С уважением. – dolm77

+1

Прежде всего, всегда '' использовать строгие; '' и '' использовать предупреждения, '' в начале вашего скрипта. Кажется, что ваш способ решить, какой файл писать, очень сложный. Просто используйте счетчик (назовите его '' $ j'') и '' open ($ fi2, '>', 'File $ j.txt ");' 'когда вам нужно открыть следующий файл. – mzedeler

+0

Не нужно вставлять файл в массив ... там действительно нет. –

ответ

1

Как это,

#!/usr/bin/env perl 
use strict; 
use warnings; 
use feature ':5.10'; 
while (defined(my $_ = <DATA>)) { 

    my ($start_tag, $end_tag); 
    if (index($_,'[TABLE]') != -1) { 
    $start_tag = 1; 
    } 
    elsif (index($_,'[/TABLE]') != -1) { 
    $end_tag = 1; 
    } 

    if ($start_tag .. $end_tag) { 
    state $fileno //= 1; 
    state $fh_gen = sub { 
     state $fh; 
     return $fh if defined $fh; 
     open ($fh, '>', "file_$fileno.txt") or die $!; 
     $fh; 
    }; 

    if ($start_tag) {} 
    elsif ($end_tag) { 
     $fileno++; 
     $fh_gen = sub { 
     state $fh; 
     return $fh if defined $fh; 
     open ($fh, '>', "file_$fileno.txt") or die $!; 
     $fh; 
     }; 
    } 
    else { 
     my $fh = $fh_gen->(); 
     print $fh $_; 
    } 

    } 

} 

__DATA__ 

[TABLE] 

DATA........ 
DATA........ 

[/TABLE] 

[PAGE] 

[TABLE] 

DATA........ 
DATA........ 

[/TABLE] 
Смежные вопросы