Модераторы: ginnie, korob2001
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Удаление строк из файла, Удаление строк из файла 
:(
    Опции темы
Klif
Дата 2.3.2004, 18:09 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Помогите плз, у меня затык!

Ситуация такая- есть текстовый файл со статистикой. Но в начале файла есть ненужная инфа о времени и т.д. - 4 строчки.
Как мне их удалить?

или может как обойти эти строчки ?
вот мой cкрипт:

while (<File>){
tr/ / /s;
($stat1,$stat2,$stat3,stat4) = split(/ /,$_);

$result=$result+$stat3;

}
print $result;

  Вверх
korob2001
Дата 2.3.2004, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 6
Всего: 61



Способов как обычно несколько.
1. Воспользуйся следующей конструкцией next if /shablon/;
Например если в каждой из этих четырёх строк есть время в следующем формате 15:34:20, то шаблон будет примерно таким:
next if /\d{1,2}:\d{2}:\d{2}/;

2. Можно также создать переменную, счётчик:
Например:
Код

my $num_of_string = 0; # Переменная счётчик
while (<File>){
$num_of_string++;    # Инкрементируем переменную счётчик
next if $num_of_string < 4; #Пропускаем первые 4 строки
tr/ / /s;
($stat1,$stat2,$stat3,stat4) = split(/ /,$_);

$result=$result+$stat3;

}

Удачи ;)

Это сообщение отредактировал(а) korob2001 - 2.3.2004, 18:44


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
GoodBoy
Дата 3.3.2004, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Главный джедай
****


Профиль
Группа: Модератор
Сообщений: 3886
Регистрация: 8.1.2003
Где: КМВ

Репутация: нет
Всего: 83



а можно и вот так:
Код

open(File, "file.stat");  # откроем файл
@lines = <File>;          # прочитаем его
close(File);              # закроем
chomp @lines;             # отрежем символы \n в конце каждой строки
splice(@lines, 0, 4);     # удалим из масива строк 4 строки, начиная с 0-й позиции
foreach (@lines) {        # для каждой строки...
   tr/ / /s;
   ($stat1,$stat2,$stat3,stat4) = split(/ /,$_);
   $result=$result+$stat3;
}
print $result;

smile.gif


--------------------
Чем дальше в лес, тем толще партизаны...

Цитата(igorold @  1.5.2016,  17:40 Найти цитируемый пост)
Индейцы не обратили внимания на поток беженцев из Европы… Теперь они живут в резервациях. 
PM MAIL   Вверх
Unregistered
Дата 3.3.2004, 13:18 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Спасибо большое!
Все работает!
Спасли мою грешую голову smile.gif))
  Вверх
ElectricalStorm
Дата 3.3.2004, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 547
Регистрация: 22.1.2004

Репутация: 1
Всего: 9



Цитата

@lines = <File>; 

не клева так делать

лучше как korob2001 написал быстрее будет
Код

while (<FILE>) {
   next if 1..4; # пропускаем строки
  #  ($stat1,$stat2,$stat3,stat4) = split;  по умолчанию тут все если не все
       переменные используются то лучше поставить undef
   (undef, undef, $stat3, undef)  = split; # или ваще (split)[2]
   $result += $stat3;
}


преобразуется

Код

while (<File>) {
   next if 1..4;
   $res += (split)[2];
}
print $res;









--------------------
Нужно знать инструмент, которым пользуешься
PM MAIL   Вверх
korob2001
Дата 3.3.2004, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 6
Всего: 61



Как написал ElectricalStorm.

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

$result=$result+$stat3;

такой строкой

$result += $stat3;

Второй вариант делает те же действия, только быстрее.

Почему?

Потому что, значение переменной $result вычисляется только 1 раз, а в твоем варианте 2 раза.

Но в принципе твой вариант тоже прекрасно работает. Как тебе удобней так и пиши, я только посоветовал. ;)

Удачи.

Это сообщение отредактировал(а) korob2001 - 3.3.2004, 22:56


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Klif
Дата 4.3.2004, 11:07 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











To korob2001

Принял к сведенью. Спасибо за совет.Я просто не думал над оптимизацией когда писал. Я просто не так давно начал кодить... теперь буду повнимательнее над кодом... smile.gif
  Вверх
Гость_case
Дата 4.3.2004, 13:15 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











оптимально так

1. cменить признак конца строки
2. считать весь файл в одну переменную
3. заменить =~ /(.+\n){4}//gi
4. записать переменную в файл
  Вверх
korob2001
Дата 4.3.2004, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 6
Всего: 61



Цитата
2. считать весь файл в одну переменную

При условии, что файл не будет слишком большим.

Это сообщение отредактировал(а) korob2001 - 4.3.2004, 19:47


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Klif
Дата 5.3.2004, 10:59 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Я поначалу так и сделал ... но так как файлы у меня могут быть мегабайт по 20... и обращений по 5-10 одновременно ... и все это с перспективой роста !


Вобщем боюсь нету у меня денег на такой сервер smile.gif

GoodBoy дал действительно более действенный вариант !
У меня скрипт стал раза в 3 меньше smile.gif

  Вверх
ElectricalStorm
Дата 5.3.2004, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 547
Регистрация: 22.1.2004

Репутация: 1
Всего: 9



зато в 3 раза тормознее smile.gif


--------------------
Нужно знать инструмент, которым пользуешься
PM MAIL   Вверх
korob2001
Дата 5.3.2004, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 6
Всего: 61



Цитата
У меня скрипт стал раза в 3 меньше

Опртимизировать код, это не значит уменьшить кол-во строк.
При оптимизации в первую очередь необходимо учитывать расход ресурсов, а только потом уменьшение размера кода.

Такой вариант:
Код

open( FILE, "< myfile.txt" ) or die "Can't open file 'myfile.txt': $!";
 my @all_file = <FILE>;
close( FILE ) or die "Can't close file 'myfile.txt': $!";

подходит только в том случае, если файл будет не слишком большим. Дело в том, что в этом случае сразу содержимое всего файла присваивается массиву @all_file, в котором каждый элемент будет содержать по одной строке. Другими словами, мы записали весь файл в оперативную память. Прошу обратить внимание на то, что оперативная память, конечна, как и всё остальное в этой жизни. ;)

А что касается такого варианта:
Код

open( FILE, "< myfile.txt" ) or die "Can't open file 'myfile.txt': $!";
while( <FILE> ) {
   # Обрабатываем каждую строку по очереди
}
close( FILE ) or die "Can't close file 'myfile.txt': $!";

то, у нас получается такая вот бодяга:

1. Мы открываем файл.
2. Читаем файл построчно, при этом каждая строка присваивается переменной $_. Если такая переменная не устраивает, то можно воспользоваться конструкцией while( my $line = <FILE> ) { блок кода };
3. Закрываем файл.

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

Удачи.

Это сообщение отредактировал(а) korob2001 - 5.3.2004, 18:46


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
GoodBoy
Дата 5.3.2004, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Главный джедай
****


Профиль
Группа: Модератор
Сообщений: 3886
Регистрация: 8.1.2003
Где: КМВ

Репутация: нет
Всего: 83



korob2001 Согласен. При написании своего варианта я и имел в виде небольшие файла, ибо Klif не сказал изначально о 20 Мб с перспективой роста... :-))))))) Для небольших же файлов это вполне оправдано!


--------------------
Чем дальше в лес, тем толще партизаны...

Цитата(igorold @  1.5.2016,  17:40 Найти цитируемый пост)
Индейцы не обратили внимания на поток беженцев из Европы… Теперь они живут в резервациях. 
PM MAIL   Вверх
korob2001
Дата 5.3.2004, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 6
Всего: 61



Цитата
Для небольших же файлов это вполне оправдано!

Согласен.
Тем более оперировать массивом гораздо проще, чем файлом. Но при этом, для себя сразу нужно решить, что файл не будет большим.

Это сообщение отредактировал(а) korob2001 - 5.3.2004, 19:08


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: Системное программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к системному программированию на Perl
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0526 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.