Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Вносим данные из большого файла в массив
Форумы портала PHP.SU » » Работа с файловой системой и файлами » Вносим данные из большого файла в массив

Страниц (1): [1]
 

1. Kubert - 02 Сентября, 2011 - 13:01:43 - перейти к сообщению
У меня есть текстовый файл весом около 3мб.
Данные в нем хранятся в таком виде:
name1 777 888 999
name2 777 888 999
name3 777 888 999
...
...
Все пробелы это табуляция!
Всего строк на данный момент чуть больше 42 тысяч.


Мне необходимо превратить это в массив такого вида:
[0]
[0][0] - name1
[0][1] - 777
[0][2] - 888
[0][3] - 999
[1]
[1][0] - name2
[1][1] - 777
[1][2] - 888
[1][3] - 999
...
...

Делаю так:
$namefile = 'file.tsv';
$file = file($namefile);
foreach($file as $k => $v){
$nfile[$k] = explode("\t",$v);
}
print_r($nfile);


А теперь ПРОБЛЕМА! Этот код работает в тестовом режиме(в файле всего 10 строк), но когда в файле 42000 строк то скрипт не работает... В чем может быть проблема?
2. EuGen - 02 Сентября, 2011 - 13:03:38 - перейти к сообщению
В том, что не хватает памяти, всеже file() загрузит в память все сразу.
Читайте построчно.
3. Kubert - 02 Сентября, 2011 - 13:14:00 - перейти к сообщению
EuGen пишет:
В том, что не хватает памяти, всеже file() загрузит в память все сразу.
Читайте построчно.


После небольшого теста читает только 35283 строк, на 35284 уже вырубается)

А как построчно? Открывать файл с определенной строкой, потом закрывать и так несколько раз? К примеру по 10000 строк?
4. EuGen - 02 Сентября, 2011 - 13:19:28 - перейти к сообщению
Пример чтения здесь:
http://php.su/functions/?fgets
5. Kubert - 02 Сентября, 2011 - 13:31:05 - перейти к сообщению
EuGen пишет:
Пример чтения здесь:
http://php.su/functions/?fgets


тоже самое, блин! В чем я не прав?

PHP:
скопировать код в буфер обмена
  1.  
  2. $namefile = 'test.tsv';
  3.  
  4. $i=0;
  5. $handle = fopen($namefile, "r");
  6. while (!feof($handle)){
  7.     $buffer = fgets($handle);
  8.         $nfile[$i] = explode("\t",$buffer);
  9.     //echo $buffer."<br>";
  10.         $i++;
  11. }
  12. fclose($handle);
  13.  
  14. print_r($nfile);
  15.  
6. EuGen - 02 Сентября, 2011 - 13:44:22 - перейти к сообщению
Все верно - если Вы не используете результаты file() нигде кроме цикла, то и с построчным методом получится то же самое - я немного ошибся, посмотрев код первого сообщения.
Вам придется расширять лимит памяти, если желаете в нее загрузить сразу весь такой массив.
7. Kubert - 02 Сентября, 2011 - 13:47:01 - перейти к сообщению
Лимит памяти? Это уже серверное как я полагаю?

Но ведь можно как я описал выше поделить цикл по 10000 строк... После сделать тоже самое но начиная с 10001 строки...
8. EuGen - 02 Сентября, 2011 - 13:49:36 - перейти к сообщению
В скрипте тоже можно:
http://php.su/functions/?ini_set
9. Kubert - 02 Сентября, 2011 - 13:51:15 - перейти к сообщению
А что мне нужно то из этого списка?))
10. EuGen - 02 Сентября, 2011 - 13:57:31 - перейти к сообщению
Думал, Вы все же не поленитесь поискать
11. Kubert - 02 Сентября, 2011 - 14:10:55 - перейти к сообщению
EuGen пишет:
Думал, Вы все же не поленитесь поискать


Спасибо! Я не ленился! Посмотрел! Но первый раз с этим сталкиваюсь. Спасибо!!!
Все получилось!

 

Powered by ExBB FM 1.0 RC1