Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.02.2010, 08:44   #1
Niodar
 
Регистрация: 20.03.2009
Сообщений: 8
По умолчанию Считывание диапазона строк из файла.

Доброго времени суток.!
сразу к делу.
Есть файл где посторочно записаны данные:

PHP код:
время значение1 значение2
время 
значение1 значение2
время 
значение1 значение2
время 
значение1 значение2
время 
значение1 значение2
время 
значение1 значение2
время 
значение1 значение2 
каким способом можно считать со 2 по 5 строку.?
Подскажите.
Niodar вне форума Ответить с цитированием
Старый 25.02.2010, 09:32   #2
mv28jam
Старожил
 
Аватар для mv28jam
 
Регистрация: 09.09.2008
Сообщений: 2,624
По умолчанию

PHP код:
$handle fopen("test.csv""r");
$result=array();
for(
$i=0;$i<5;$i++){
   
$data fgetcsv($handle1000"|"));
   if(
$i>0)$result[]=$data;

Стрелок-охотник

Последний раз редактировалось mv28jam; 25.02.2010 в 09:35.
mv28jam вне форума Ответить с цитированием
Старый 26.02.2010, 15:31   #3
InternetStranger
php / delphi
Форумчанин
 
Аватар для InternetStranger
 
Регистрация: 10.06.2007
Сообщений: 175
По умолчанию

Как вариант можно и так:
PHP код:
$data file("test.csv");
$result=array();
for (
$i=2;$i<5;$i++){
    
$result[]=$data[$i-1];

ps: особенно актуально, если кол-во строк > 1000 (в этом случае обычно стараются минимизировать обращение к диску)
G.Azamat { Web Development / Computer simulation }
Начинающий программист думает, что в килобайте 1000 байтов, а законченный уверен, что в километре 1024 метра.

Последний раз редактировалось InternetStranger; 26.02.2010 в 16:43.
InternetStranger вне форума Ответить с цитированием
Старый 26.02.2010, 15:46   #4
wanick
Пользователь
 
Регистрация: 25.02.2010
Сообщений: 26
По умолчанию

InternetStranger, в твоем варианте будет строки будут браться не со 2й а с 3й, ты забыл про 0й элемент массива, чем циклы крутить можно воспользоваться функцией array_slice

InternetStranger, ну а если файл весит 1 -2 гига что будет?

Последний раз редактировалось wanick; 26.02.2010 в 15:49.
wanick вне форума Ответить с цитированием
Старый 26.02.2010, 15:54   #5
mv28jam
Старожил
 
Аватар для mv28jam
 
Регистрация: 09.09.2008
Сообщений: 2,624
По умолчанию

to InternetStranger

Если использовать предложенный вами код то мы получим целый файл, какого бы он обьема не был, в оперативной памяти, а нам то надо только 4 строки.
Цитата:
Сообщение от InternetStranger Посмотреть сообщение
ps: особенно актуально, если кол-во строк > 1000 (в этом случае обычно стараются минимизировать обращение к диску)
Особенно опасно использовать ваш код в случае если кол-во строк > 1000.
Стрелок-охотник
mv28jam вне форума Ответить с цитированием
Старый 26.02.2010, 18:25   #6
InternetStranger
php / delphi
Форумчанин
 
Аватар для InternetStranger
 
Регистрация: 10.06.2007
Сообщений: 175
По умолчанию

Цитата:
Сообщение от wanick Посмотреть сообщение
InternetStranger, в твоем варианте будет строки будут браться не со 2й а с 3й, ты забыл про 0й элемент массива
Про нулевой не забыл, забыл указать индекс. Поправил. Ты должно быть не заметил, что мой код выше вообще не работал как надо.

Цитата:
Сообщение от wanick Посмотреть сообщение
чем циклы крутить можно воспользоваться функцией array_slice
Да что говоришь?! Смотри внимательно первый пост. Хоть автор ничего и не сказал, но наличие 3х колонок не натолкнуло на мысль необходимости пропарсить эти строки. Теперь посмотри во второй пост - mv28jam - его натолкнуло - fgetcsv($handle, 1000, "|"));. И как будем парсить не перебирая строки? в моем случае это делается небольшой модификацией
PHP код:
 $result[] = explode('|'$data[$i-1] ); 
Цитата:
Сообщение от wanick Посмотреть сообщение
InternetStranger, ну а если файл весит 1-2 гига что будет?
Давай подумаем, каждая строка в указанном файле весит 30 байт (+-1 в зависимости от типа файла - UNIX или ANSI). В файле весом 1 Гб должно быть 35791394 строки. Как-то автор забыл о таких случаях упомянуть


Цитата:
Особенно опасно использовать ваш код в случае если кол-во строк > 1000.
Не соглашусь. Когда я писал свой код, то исходил вот из каких соображений:
- хостинг средней паршивости предоставляет скрипту ~ 10 Mb (на глазок).
- 1000-10000 строк - это примерно 30-300 Kb.
Что плохого, в том, чтобы обрабатывать не из файла, а из оперативной памяти? По-моему, так быстрее. Не тестировал конечно - поправьте если я чего-то не знаю.
Но моя политика такая (заметьте, никому не навязываю) - сводить все манипуляции с БД и диском к единым запросам.

ps: Я вообще-то хотел указать автору на альтернативное решение, а вовсе не ставил своей целью указывать на непроффесионализм чужого кода (как вам, возможно, показалось), тем более если автор не указывал границы применимости скрипта.

pss: Если уж речь зашла о файлах большого размера (скажем 1Gb ~ 35791394 строк), то ни один здравомыслящих программистов не станет использовать ни file(), ни fgets() (т.е. в текстовом режиме). Я почти уверен, что скрипт загнется по истечении 20-30 сек. ограничения.
php вообще не для этих целей, но если придется, то вот как я бы поступил - читал бы в бинарном режиме:
PHP код:
...
$SizeOfLine=30// определяем размер строки в байтах (вместе с символами конца строки, перевода каретки)
fseek($f$SizeOfLine*1SEEK_SET ); // устанавливаем на начало строки
$data fread($f$SizeOfLine*); // читаем 4 строки, можно и в цикле по одной, как угодно
$result explode'\n'$data ); // разбиваем на строки по символу конца строки (в зависимости от типа файла)
... 
Вот как-то так это делается ( работоспособность не проверял. здесь просто схема )
G.Azamat { Web Development / Computer simulation }
Начинающий программист думает, что в килобайте 1000 байтов, а законченный уверен, что в километре 1024 метра.
InternetStranger вне форума Ответить с цитированием
Старый 26.02.2010, 18:58   #7
mv28jam
Старожил
 
Аватар для mv28jam
 
Регистрация: 09.09.2008
Сообщений: 2,624
По умолчанию

Цитата:
Сообщение от InternetStranger Посмотреть сообщение
Не соглашусь.
А зря не соглашаетесь, я вам как человек который работает с высоконагруженными приложениями говорю.
Цитата:
Сообщение от InternetStranger Посмотреть сообщение
Когда я писал свой код, то исходил вот из каких соображений:
- хостинг средней паршивости предоставляет скрипту ~ 10 Mb (на глазок).
- 1000-10000 строк - это примерно 30-300 Kb.
А если таких человек 10, а если 100 + не забываем что оперативную память занимает не только этот файл и получаем ошибку 500.
Цитата:
Сообщение от InternetStranger Посмотреть сообщение
Что плохого, в том, чтобы обрабатывать не из файла, а из оперативной памяти? По-моему, так быстрее. Не тестировал конечно - поправьте если я чего-то не знаю.
Не надо забывать что время уходит и на чтение и запись файла в оперативную память. Оперативная память не резиновая и данные которые закешил mysql могут попасть в подкачку, а mysql просто так ничего не кешит. При обращении к файлу на диске, его(жесткого диска) логика помещает часть файла в буфер обмена тк предполагает, что его будут читать и скорость работы с диском повышается.
Цитата:
Сообщение от InternetStranger Посмотреть сообщение
то ни один здравомыслящих программистов не станет использовать ни fgets()
Код:
string fgets ( resource $handle [, int $length ] )

Gets a line from file pointer.
Как раз таки будут. fgets как видно из описания читает одну строку начиная с указателя, те занимает в оперативке ровно столько памяти сколько занимает нужная строка. Те делает ровно тоже, что и представленный вами код и работает наверное быстрее.
Стрелок-охотник

Последний раз редактировалось mv28jam; 26.02.2010 в 19:01.
mv28jam вне форума Ответить с цитированием
Старый 26.02.2010, 18:58   #8
mv28jam
Старожил
 
Аватар для mv28jam
 
Регистрация: 09.09.2008
Сообщений: 2,624
По умолчанию

продублировался пост
Стрелок-охотник

Последний раз редактировалось mv28jam; 26.02.2010 в 19:00. Причина: duplicate
mv28jam вне форума Ответить с цитированием
Старый 26.02.2010, 19:29   #9
InternetStranger
php / delphi
Форумчанин
 
Аватар для InternetStranger
 
Регистрация: 10.06.2007
Сообщений: 175
По умолчанию

Цитата:
А если таких человек 10, а если 100 + не забываем что оперативную память занимает не только этот файл и получаем ошибку 500.
Теперь согласен. Тут мой код проигрывает.

Хм... про fgets наверное я поторопился. Вот где бы посмотреть как работает эта процедура, исходников-то нету. И дезассемблировать не получится.
Но интуиция подсказывает, что все таки надежнее работать с низкоуровневыми процедурами ))

Цитата:
с высоконагруженными приложениями
в какой области, если не секрет? Серверно-сетевыми приложениями?
А я работаю с высокоскоростными вычислениями на настольных системах ))
G.Azamat { Web Development / Computer simulation }
Начинающий программист думает, что в килобайте 1000 байтов, а законченный уверен, что в километре 1024 метра.

Последний раз редактировалось InternetStranger; 26.02.2010 в 19:34.
InternetStranger вне форума Ответить с цитированием
Старый 26.02.2010, 19:50   #10
mv28jam
Старожил
 
Аватар для mv28jam
 
Регистрация: 09.09.2008
Сообщений: 2,624
По умолчанию

Цитата:
Сообщение от InternetStranger Посмотреть сообщение
Хм... про fgets наверное я поторопился. Вот где бы посмотреть как работает эта процедура, исходников-то нету. И дезассемблировать не получится.
Но интуиция подсказывает, что все таки надежнее работать с низкоуровневыми процедурами ))
Откройте для себя мир Linux и исходников в С. Вообщем можно скачать php под nix и там посмотреть исходник, если так интересно.
Цитата:
Сообщение от InternetStranger Посмотреть сообщение
в какой области, если не секрет? Серверно-сетевыми приложениями?
А я работаю с высокоскоростными вычислениями на настольных системах ))
Скажем так, мой код работает на сайтах с загрузкой от 600 просмотров в минуту. Подробности только в личку.
Стрелок-охотник
mv28jam вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как получить в VBA номера строк выделенного диапазона? Chelentano Microsoft Office Excel 10 04.11.2010 14:25
c++ считывание с файла. tsergey Помощь студентам 20 24.04.2010 23:30
Считывание строк из файла Mikimaus Общие вопросы C/C++ 1 05.12.2009 21:05
Считывание строк из файла. перемещение по строкам "веред"-"назад" Larkin. Помощь студентам 2 15.06.2009 17:58
Считывание строк в массив mc_12 Общие вопросы C/C++ 4 05.01.2009 13:11