Скрипт для удаления первой строки из всех текстовых файлов в каталоге - PullRequest
3 голосов
/ 01 марта 2012

Я пытаюсь написать Perl-скрипт, который читает все текстовые файлы в каталоге и записывает все строки, кроме первой, в отдельный файл.Если есть 3 файла, я хочу, чтобы скрипт прочитал все эти 3 файла и записал 3 новых файла с одинаковыми строками, кроме первого.Это то, что я написал ... но когда я пытаюсь запустить скрипт, он работает нормально, без ошибок, но не выполняет работу, которую он должен.Может кто-нибудь, пожалуйста, посмотрите на это?

opendir (DIR, "dir\\") or die "$!";
my @files = grep {/*?\.txt/}  readdir DIR;
close DIR;
my $count=0;
my $lc;
foreach my $file (@files) {
   $count++;
   open(FH,"dir\\$file") or die "$!";
   $str="dir\\example_".$count.".txt";
   open(FH2,">$str");
   $lc=0;
   while($line = <FH>){
        if($lc!=0){
            print FH2 $line;
        }
        $lc++;
    }
   close(FH);
   close(FH2);
}

А второй файл не существует, он должен быть создан скриптом.

Ответы [ 3 ]

1 голос
/ 01 марта 2012

Попробуйте изменить эти строки

opendir (DIR, "dir\\") or die "$!";
...
close DIR;

на

opendir (DIR, "dir") or die "$!";
...
closedir DIR;

Я попытался запустить ваш код локально, и у меня были только две проблемы с именем каталога, содержащим завершающий слеш и попыткойиспользовать функцию filehandle close () на dirhandle.

1 голос
/ 01 марта 2012

Если у вас есть список файлов ...

foreach my $file ( @files ) {
  open my $infile , '<' , "dir/$file" or die "$!" ;
  open my $outfile , '>' , "dir/example_" . ++${counter} . '.txt' or die "$!" ;
  <$infile>; # Skip first line.
  while( <$infile> ) {
    print $outfile $_ ;
  }
}

Лексические дескрипторы файлов будут автоматически закрываться при выходе из области видимости.

0 голосов
/ 01 марта 2012

Не уверен, почему вы используете $ count здесь, поскольку это просто превратит список файлов вроде:

01.txt
bob.txt
alice.txt
02.txt

в:

01_1.txt
bob_2.txt
alice_3.txt
02_4.txt

Имейте в виду,@files не сортируется, поэтому он будет возвращать в том порядке, в котором файлы существуют в таблице каталогов.Если бы вы удалили и заново создали файл 01.txt, он был бы перемещен в конец списка, переупорядочив весь набор:

bob_1.txt
alice_2.txt
02_3.txt
01_4.txt

, поскольку это на самом деле не было частьюВаш первоначальный вопрос, это именно то, что вы просили сделать:

#!/usr/bin/perl
while(<*.txt>) { # for every file in the *.txt glob from the current directory
    open(IN, $_) or die ("Cannot open $_: $!"); # open file for reading
    my @in = <IN>; # read the contents into an array
    close(IN); # close the file handle
    shift @in; # remove the first element from the array

    open(OUT, ">$_.new") or die ("Cannot open $_.new: $!"); # open file for writing
    print OUT @in; # write the contents of the array to the file
    close(OUT); # close the file handle
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...