Forum Webscript.Ru

Программирование => Perl => Тема начата: DamonLSD от 02 Февраля 2006, 17:27:34

Название: Поиск, замена и сохранение результатов, НО...
Отправлено: DamonLSD от 02 Февраля 2006, 17:27:34
Здравствуйте!
Имеется файл, который я открываю, нахожу и "вырезаю" нужные строки и сохраняю эти строки в новом файле.
Подскажите, а как сохранить в новом файле не все найденные строки, а только скажем, первые пять?!

Спасибо.
Название: Поиск, замена и сохранение результатов, НО...
Отправлено: AnnA от 02 Февраля 2006, 20:17:12
вырезайте в массив первые 5 строк. или в хеш.
что-либо в роде for(1..5) { пишем в новый файл }
покажите эту часть кода:
Цитировать
DamonLSD:
"вырезаю" нужные строки и сохраняю эти строки в новом файле
Название: Поиск, замена и сохранение результатов, НО...
Отправлено: DamonLSD от 02 Февраля 2006, 22:10:21
open(FILE,"$file") || print "Файл не найден!\\n";
@str=;
close FILE;
open(FILE,">$file");

for($i=0;$i<=$#{@str};$i++)
{

## если попадаются строки, содержащие " blabla XXX "
## то я их "вырезаю" из $file и сохраняю в файле tmp.txt
   if($str[$i]=~ / blabla XXX /)  {
   open (F813, ">>tmp.txt") || die print "Cannot open file: $!";
   print F813 "$str[$i]";
   close (F813);
   $str[$i]="";
   }

print FILE "$str[$i]";
}


close FILE;
close FILE;
Название: Поиск, замена и сохранение результатов, НО...
Отправлено: AnnA от 03 Февраля 2006, 14:25:46
самый простейший вариант, на основе вашего кода:
#!/usr/bin/perl -w
use strict;
my ($file,$destination,$k,@lines) = (\'../data/source.txt\',\'../data/destination.txt\',1,\'\');

print "\\n\\n";
open(FILE,"$file") || print "Файл не найден!\\n";
seek(FILE,0,0); my @str=; close FILE;

open(FILE,">$file");
for(my $i=0;$i<=$#str;$i++) {
if($str[$i]=~ /blabla XXX/) {  if ($k<=5) {push @lines,$str[$i]; $k++} $str[$i]=""; }
print FILE $str[$i];
}
close FILE;

if(@lines) {
open (F813, ">>$destination") || die print "Cannot open file: $!";
print F813 @lines;
close (F813);
}
но вообще это не лучший вариант: смею надеяться, что у вас $file небольшого объёма и позволяет использовать @str=;
:)
Название: Поиск, замена и сохранение результатов, НО...
Отправлено: DamonLSD от 03 Февраля 2006, 17:39:41
Спасибо! ... сейчас попробую
Название: Поиск, замена и сохранение результатов, НО...
Отправлено: DamonLSD от 03 Февраля 2006, 18:29:15
AnnA, спасибо тебе за подсказку ;) ... у меня заклинило, что надо через цикл делать, вот и не получалось.
Изменил свой код, смотри что получилось:

$cnt = 0;

open(FILE,"$file") || print "Файл не найден!\\n";
@str=;
close FILE;
open(FILE,">$file");
for($i=0;$i<=$#{@str};$i++)
{
## если попадаются строки, содержащие " blabla XXX "
## то я их "вырезаю" из $file и сохраняю в файле tmp.txt
if($str[$i]=~ / blabla XXX /)  {

   if ($cnt<=5) {

open (F813, ">>tmp.txt") || die print "Cannot open file: $!";
print F813 "$str[$i]";
close (F813);
$str[$i]="";

   }
   $cnt++;

}
print FILE "$str[$i]";
}
close FILE;
close FILE;


... все работает!
спасибо :)
Название: Поиск, замена и сохранение результатов, НО...
Отправлено: AnnA от 06 Февраля 2006, 12:36:33
на мой взгляд, когда "работает", важно еще и как работает.
зачем вы открываете/закрываете файл в режим дописывания 5 раз, когда это можно сделать 1 раз? :)
и в вашем варианте после 5-го раза найденный текст не обнуляется в исходном файле. так и нужно было?
Цитировать
DamonLSD:
close FILE; close FILE;
а это зачем? :)