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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с файлом в Perl, работа с текстовым файлом на пёрле 
:(
    Опции темы
C.Smoke
  Дата 12.2.2005, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 16.1.2005
Где: Сертолово(СПб)

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



Доброго времени суток!

Проблема в следующем:
Есть фаил "ITEMS.txt"
в нём записаны данные вида:
"#001::100::90::text
#002::65::75::text2
... и т.д."

как на Perl заменить одну строку на другую.
например :
"#002::65::75::text2" на "#002::64::75::text2"
без её смещения в тексте.

возможно ли такое. и если есть в Perl функция которая очищает фаил перед открытием немогли бы вы про неё рассказать.

Зарание Спасибо!

smile
PM MAIL ICQ   Вверх
dimes
Дата 12.2.2005, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(C @ 12.2.2005, 12:22)
и если есть в Perl функция которая очищает фаил перед открытием немогли бы вы про неё рассказать.

Есть такая функция! Замечательная функция! И в любой документации нормально описаная.

Открывает файл для записи если нет файла, создаст, если есть очистит
open(FIL,">file.txt");

Открывает файл для четения и записи если нет файла, создаст, если есть очистит
open(FIL,"+>file.txt");


Цитата(C @ 12.2.2005, 12:22)
как на Perl заменить одну строку на другую. без её смещения в тексте.

А никак, понятие строки ввели люди для удобства а в файле нет никаких строк, но можно проблемму решить так:

1. Загрузить файл в память, там его отредактировать а потом сохранить
+ очень просто
- может памяти не хватить
- следит чтобы другие процессы не могли править этот файл, но это легко решается.
2. В процессе прочтения файла создавать копию исходного файла с отредактироваными строками а потом копией заменить оригенал.
+ Нужно мало памяти
+ Строки легко удаляются
+ Файл занимает ровно столько сколько он содержит инфы + некая служебная инфа
- Нужно больше памяти на винте (ерунда конечно но всетаки...)
- много не нужный действий, если в файле 1000 строк а нужно отредактировать 10 то оставшиеся 990 строк всеравно придется копировать.
- Немного труднее лочить файл для других процессов
3. Создать файл с фиксированными размером поля, т.е. всегда считать что строка не может быть больше или меньше указанного размера. Если меньше то добивать до указанного размера, если больше то усекать.
+ меньше операции, по сравнению с 2
+ проще лочить файл
+ нужно не много памяти
- задача не тривеальная, не для новичка
- нужно больше места не винте для файла
- теряется инфа в строке каторая не влезла в строку
- если меняется размер строки, нужно будет пересоздать файл
- появление дыр в файле из-за удаления строк

Это сообщение отредактировал(а) dimes - 12.2.2005, 12:56
PM ICQ   Вверх
C.Smoke
  Дата 12.2.2005, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 16.1.2005
Где: Сертолово(СПб)

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



Цитата
1. Загрузить файл в память, там его отредактировать а потом сохранить
+ очень просто
- может памяти не хватить
- следит чтобы другие процессы не могли править этот файл, но это легко решается.


А сколько выделяется памяти?
у меня в файле 300-500 строк
по ~30 символов. (9000-15000символов в файле)
хватит ли памяти на такой фаил!?
подойдёт ли такой код:
Код

open(BASE,"+>ITEMS.txt");
@base=<BASE>;
foreach $str (@base)
{
               # какие то действия с данными
print (BASE,"$id::$col::$cen::$nam\n"); #запись данных обратно в фаил
}
close(BASE);


насколько медленный этот способ?
Заранее спасибо smile
PM MAIL ICQ   Вверх
dimes
Дата 12.2.2005, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(C @ 12.2.2005, 14:24)
А сколько выделяется памяти?
у меня в файле 300-500 строк
по ~30 символов. (9000-15000символов в файле)
хватит ли памяти на такой фаил!?

Не знаю. 15 немного но если завтра станет 1.5М? Или если он(скрипт) дергается 20 раз в сек? Или ты уже загрузил 2М. Самое точное нам скажет опыт smile


Цитата(C @ 12.2.2005, 14:24)
open(BASE,"+>ITEMS.txt");
@base=<BASE>;

Конструкиция бессмысленна, потому что
Цитата(dimes @ 12.2.2005, 13:54)
Открывает файл для четения и записи если нет файла, создаст, если есть очистит

Т.е. ты гарантированно читаеш пустой файл.


Цитата(C @ 12.2.2005, 14:24)
foreach $str (@base)
{
# какие то действия с данными
print (BASE,"$id::$col::$cen::$nam\n"); #запись данных обратно в фаил
}

Так как ты читаеш пустой файл то это не будет ошибки, но если ты хочеш работать с уже наполенным файлом, то забыл 2 комманды.

Код

seek(BASE,0,0); # Поставит указатель в начало файла, ты же дочитал его до конца.
truncate(BASE,0); # Урежит файл в 0 чтобы небыло хвостов.
# Если дальше пойдет что то не так то ты потеряеш все данные!!!
foreach $str (@base)
{
# какие то действия с данными
print (BASE,"$id::$col::$cen::$nam\n"); #запись данных обратно в фаил
}


Так же пропущенна команда flock, как ты будеш отслеживать одновременный доступ к файлу от разных клиентов?
PM ICQ   Вверх
C.Smoke
  Дата 12.2.2005, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 16.1.2005
Где: Сертолово(СПб)

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



Огромное спасибо!
Всё работает! smile

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


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

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


 




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


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

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