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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Удаление строки в начале файла для группы файлов, Удаление и вставка 
:(
    Опции темы
agrekalov
Дата 19.3.2007, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Доброго времени суток: есть такая задача, удалить первую строку из файла, удалить в конце файла символ перевода строки и добавить в конец две строки. С горем пополам и с помощью коллег по изучению Perl'а удалось написать такой скрипт для обработки одного файла:
Код

my $line_1 = "\nПервая строка для добавления\n";
my $line_2 = "Вторая строка для добавления\n";
# --------------
my $file = $ARGV[0];
open $f, "<", "$file";
my @text = ();
# Считываю файл в массив удаляю символ переход строки
while ($line=<$f>) { 
    chop $line;
    $line .="\n";
    @text = (@text, $line) 
    }
close $f;
# Удаляю первую строку
splice(@text, 0, 1);
# Добавляю две строки
@text = (@text, $line_1, $line_2);

open $f, ">", "$file";
truncate $f, 0;

print $f @text;
close $f;

но файлов многовато для обработки этим скриптом, как сделать для обработки группы файлов ? Файлы имеют расширение .txt размер 11-12 кбайт.
PM MAIL   Вверх
amg
Дата 20.3.2007, 08:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

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



Для всех файлов, перечисленных в качестве аргументов к скрипту
Код

my $line_1 = "\nПервая строка для добавления\n";
my $line_2 = "Вторая строка для добавления\n";
# --------------
foreach my $file (@ARGV) {
  open my $f, "<", "$file" or die;
  # Считываю файл в массив удаляю символ перехода последней строки
  my @text = <$f>;
  chomp $text[-1];
  close $f;
  
  # Удаляю первую строку
  shift @text;
  
  # Добавляю две строки
  push @text, ($line_1, $line_2);

  open $f, ">", "$file" or die;
  print $f @text;
  close $f;
}



Это сообщение отредактировал(а) amg - 20.3.2007, 08:50
PM MAIL   Вверх
Nab
Дата 20.3.2007, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 582
Регистрация: 25.3.2006
Где: Kiev

Репутация: 3
Всего: 37



amg, очень красиво и правильно все показал.
Правда остался еще один вариант, это не заганять файл в массив, используется как правило для больших объемов, а редактировать построчно по мере поступления информации с выводом во временный файл и последующим переименованием....

А вообще это идеальная задача для sed smile



--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
amg
Дата 20.3.2007, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

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



Для всех файлов с расширением $ext в директории $dir и поддиректориях.
(Скрипт запускается без аргументов)
Код

my $line_1 = "\nПервая строка для добавления\n";
my $line_2 = "Вторая строка для добавления\n";
my $ext = '.txt';
my $dir = '.'; # текущая директория

use File::Find;
find(\&wanted, $dir);
# --------------
sub wanted {
  /\Q$ext\E$/o ? (my $file = $_) : return;
  # Здесь кусок кода, находящийся внутри цикла foreach предыдущего поста
}


Добавлено @ 09:36 
Nab, а как с помощью sed удалить 1-ю строку? Что-то не соображу...
PM MAIL   Вверх
Nab
Дата 20.3.2007, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 582
Регистрация: 25.3.2006
Где: Kiev

Репутация: 3
Всего: 37



Цитата(amg @  20.3.2007,  09:22 Найти цитируемый пост)
Nab, а как с помощью sed удалить 1-ю строку? Что-то не соображу...

Код

sed '1d' file.txt


Правда с удалением последнего перевода строки могут возникнуть трудности, но тоже можно преодолеть smile



--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
agrekalov
Дата 20.3.2007, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

##! /usr/bin/perl
my $line_1 = "\nДиректор:\n";
my $line_2 = "Главный бухгалтер:\n";
my $ext = '.txt'; #расширение
my $dir = '.'; #текущая директория
use File::Find;
find (\&wanted, $dir);
# --------------
sub wanted
{
 /\Q$ext\E$/o ? (my $file = $_) : return;
#foreach my $file (@ARGV) 
open my $f, "<", "$file" or die;
#Считываю файл в массив и удаляю символ перехода последней строки
my @text = <$f>;
    chomp $text[-1];
close $f;

shift @text;

push @text, $line_1, $line_2;

open $f, ">", "$file" or die;
print $f @text;
close $f;
}


Что то для файлов .txt в директории где расположен скрипт не работает, подскажите, где я не правильно списал?
PM MAIL   Вверх
amg
Дата 20.3.2007, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

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



Вроде, все правильно (разве что ##! /usr/bin/perl поменять на #!/usr/bin/perl).
Не ругается ли скрипт? Есть ли модуль File::Find?
Добавил в скрипт пару строк для отладки. Попробуй еше.
Код

my $line_1 = "\nДиректор:\n";
my $line_2 = "Главный бухгалтер:\n";
my $ext = '.txt'; #расширение
my $dir = '.'; #текущая директория
use File::Find;
find (\&wanted, $dir);
# --------------
sub wanted
{
  print "File $File::Find::name\n";
  /\Q$ext\E$/o ? (my $file = $_) : return;
  print "  Process $_\n";
  open my $f, "<", "$file" or die;
  #Считываю файл в массив и удаляю символ перехода последней строки
  my @text = <$f>;
  chomp $text[-1];
  close $f;

  shift @text;

  push @text, $line_1, $line_2;

  open $f, ">", "$file" or die;
  print $f @text;
  close $f;
}



Это сообщение отредактировал(а) amg - 20.3.2007, 15:06
PM MAIL   Вверх
amg
Дата 20.3.2007, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

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



Цитата(Nab @  20.3.2007,  10:49 Найти цитируемый пост)
sed '1d' file.txt

Nab, спасибо! Оказывается, возможности sed отнюдь не исчерпываются регулярными выражениями smile 
Обнаружил даже, что есть специальное обозначение последней строки, $. Правда, не понимаю пока, как этим воспользоваться для удаления символа конца строки в ней.
PM MAIL   Вверх
Nab
Дата 20.3.2007, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 582
Регистрация: 25.3.2006
Где: Kiev

Репутация: 3
Всего: 37



Да пожалуйста smile
вот у меня на сайте я выложил как-то:
http://freesco.linux.kiev.ua/docs/books/sed_awk.shtml
по моему лучший минимально необходимый мануал...

А с переводом строки я в конце тоже не знаю что сделать... :(
всеже sed потоковый редактор и работа со строками у него сделана прозрачно, то есть он перевод строки сам автоматом добавляет и удаляет, и это при написании нужно учитывать...


--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
agrekalov
Дата 20.3.2007, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(amg @  20.3.2007,  14:59 Найти цитируемый пост)
Добавил в скрипт пару строк для отладки. Попробуй еше.

Спасибо. Странно, после добавления строк отладки все заработало, сам не понял в связи с чем (. Попробовал без строк отладки, работает. Всем еще раз огромное спасибо.
PM MAIL   Вверх
Nab
Дата 27.3.2007, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 582
Регистрация: 25.3.2006
Где: Kiev

Репутация: 3
Всего: 37



Вот чет вспомнил об этой задаче...
Код

sed '1d;$a\
Директор:\
Главный бухгалтер:'

и все... smile


--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
amg
Дата 28.3.2007, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

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



Цитата(Nab @  27.3.2007,  17:36 Найти цитируемый пост)
и все...
А вот и не все smile . Проблема "неправильной" последней строки остается. Т.е. если файл не оканчивается символом "\n" (распространенная ситуация), то первая строка добавляемого текста будет дописываться к последней строке файла.

PM MAIL   Вверх
Nab
Дата 30.3.2007, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 582
Регистрация: 25.3.2006
Где: Kiev

Репутация: 3
Всего: 37



Цитата(amg @ 28.3.2007,  12:04)
Цитата(Nab @  27.3.2007,  17:36 Найти цитируемый пост)
и все...
А вот и не все smile . Проблема "неправильной" последней строки остается. Т.е. если файл не оканчивается символом "\n" (распространенная ситуация), то первая строка добавляемого текста будет дописываться к последней строке файла.

А она и должна туда дописываться smile так что все верно, я вообще последний перевод строки не учитываю, а ставлю свой smile


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


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

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


 




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


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

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