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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чтение файла побайтово 
V
    Опции темы
Perl_sapiens
  Дата 19.3.2008, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Очень простой вопрос: Как читать файл не весь сразу(как это делает open(...);@txt=<file>;, грузя весь файл в память), а побайтово? А то очень не удобно, когда надо оч большой файл читать(>100 мегов)...
 smile 
PM MAIL   Вверх
ginnie
Дата 19.3.2008, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



Perl_sapiens, читаем описание функции read


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
KSURi
Дата 19.3.2008, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



perldoc -f read

Добавлено через 20 секунд
Опоздал)


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
arto
Дата 19.3.2008, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



$/ = \1
PM MAIL ICQ   Вверх
ginnie
Дата 19.3.2008, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



Уважаемый arto, а '\1' - это, случайно, не ссылка на константу?

P.S. Вопрос снимается, т.к. "чукча не читатель, чукча - писатель" smile (для таких-же, как я: читать описание $/ в perlvar)

Это сообщение отредактировал(а) ginnie - 19.3.2008, 18:57


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Perl_sapiens
Дата 19.3.2008, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Люди, а можно пример, а то я в англ. не оч хорошь smile 
PM MAIL   Вверх
ginnie
Дата 19.3.2008, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



Пример из Интернета

Код

#!/usr/bin/perl
$format_str = 'A40 A10 A60';
open DATA, 'binary.dat' or die "$!";
while (read(DATA, $buf, 40+10+60)) { # <DATA> не покатит: такая
# конструкция будет читать до символа перевода строки, а это не то, что нужно
        ($name, $phone, $address) = unpack($format_str, $buf);
        # Теперь в $name, $phone, $address есть данные и с ними можно делать
        # все, что захочется
}
close DATA;



--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Perl_sapiens
Дата 19.3.2008, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спс. И последних 2 вопроса:
1) read FILEHANDLE,SCALAR,LENGTH,OFFSET. Что значит тут ОФФСЕТ?
2) Как прочесть не с начало файла, а, скажем, с 10 байта?
PM MAIL   Вверх
KSURi
Дата 19.3.2008, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Perl_sapiens, неужели вы читать не умеете? оО

Цитата

An OFFSET may be specified to place the read data at some place in the string other than the beginning. A negative OFFSET specifies placement at that many characters counting backwards from the end of the string. A positive OFFSET greater than the length of SCALAR results in the string being padded to the required size with "\0" bytes before the result of the read is appended.



--------------------
Died at Life.pl line 21
PM Jabber   Вверх
shamber
Дата 20.3.2008, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



KSURi, он же сказал smile 

Цитата(Perl_sapiens @  19.3.2008,  20:09 Найти цитируемый пост)
а то я в англ. не оч хорошь




Perl_sapiens, Ваш первый вопрос, как ни странно связан со вторым 
offset это смещение

ЗЫ гугл translate вам в помощь.
PM MAIL Jabber   Вверх
amg
Дата 20.3.2008, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Perl_sapiens, если файл не бинарный, то, может, сгодится не по-байтово, а по-строчно? Перл идеально приспособлен для обработки строк, и многие вещи будет сделать гораздо легче.
PM MAIL   Вверх
tishaishii
Дата 20.3.2008, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Создатель
***


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

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



seek, tell, pack, unpack, read, write, truncate, ...
PM MAIL ICQ Skype   Вверх
GoDleSS
Дата 20.3.2008, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Perl_sapiens, вот еще в нагрузку старенький набросок для чтения указанного размера строк с конца файла, опирается на sysseek и побайтовое чтение. Не сказать, что слишком грамотный пример, но зато простой smile

Код

#!/usr/bin/perl 
############ 
# Использование функции: 
# @array=readBottomLines('имя_файла', число_строк); 
############ 
$|=1; 
END { sleep(10); }
 
print join("\n", readBottomLines($0, 34)); 
 
sub readBottomLines { 
  my ($file, $num)=(shift, shift); 
 
  my ($i, $buffer, $fc, $pos) = (0, undef, -1, undef); 
 
  @_=(); 
 
  open(_IF, $file); 
    while ($num) { 
      sysseek(_IF, $fc, 2); 
      sysread(_IF, $data, 1); 
      if ($data=~m/[^\n]/) { 
        $buffer=$data.$buffer; 
      } else { 
        $buffer=~s/\r$//; 
        $_[$i]=$buffer; 
        $buffer=''; 
        $i++; 
        $num--; 
      } 
      $fc--; 
    } 
  close(_IF); 

  return reverse(@_); 
}

--------------------
It's a nice day to die my friend!
PM MAIL WWW ICQ   Вверх
BurnerCode
Дата 20.3.2008, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Perl_sapiens  я так понял у тебя файл не постоянен, т.е. обнавляется (наверное логфайл).

Вот отрывок из моего сценария:

Код

open(ACCESS_RO, "</usr/local/squid/logs/access.log") or die "$!";

if( -f '.p0s' && ((stat('.p0s'))[7]) > 0 ) {
    open(POS_RO, "<.p0s") or die "$!";
    chomp($POS = <POS_RO>);
    close POS_RO;
    sysseek(ACCESS_RO, $POS, 0)
} else {
    sysseek(ACCESS_RO, 0, 0)
}

while(<ACCESS_RO>)
{
        $TELL = tell(ACCESS_RO>);
        # действия
}

close ACCESS_RO;

if($TELL > 0) {
    open(POS_WR, ">.p0s") or die "$!";
     print POS_WR $TELL;
    close POS_WR && print "[+] Position $TELL write\n"
} else {
    print "[-] Dont write possition, because pos=$TELL\n"
}


Очень удобно исп функции sysseek и tell тогда когда у тебя файл обнавляется и тебе нужна его парсить не с 0-ля а с последней позиции.
PM MAIL   Вверх
Perl_sapiens
Дата 21.3.2008, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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


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

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


 




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


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

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