Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как циклично, не зная количество файлов, каталогов и строк...
 
 автор: Shorr Kan   (07.04.2005 в 12:15)   письмо автору
 
 

...брать построчно информацию из файлов?

То есть, скажем, у меня есть каталог A. В нем несколько подкаталогов. Сколько - неизвестно. В каждом из этих подкаталогов - несколько файлов. Сколько - неизвестно. В каждом файле - уйма строк. Сколько - опять неизвестно.

Как можно циклично получать в массив полностью одну и ту же, по счету, строку, из всех файлов данного подкаталога?

p.s. Количество строк во всех файлах одного подкаталога - одинаково.

   
 
 автор: Loki   (07.04.2005 в 13:02)   письмо автору
 
   для: Shorr Kan   (07.04.2005 в 12:15)
 

Я бы предположил что потребудется два вложенных условных оператора while. Один берет каталог и передает управление следующему, поочередно подбирающему файлы пока не кончатся, затем следующий...

   
 
 автор: Akira   (07.04.2005 в 13:06)   письмо автору
 
   для: Loki   (07.04.2005 в 13:02)
 

Я тут пробывал, тут дело в том, что папки идут впереди файлов.
И получаеться каша =(

   
 
 автор: cheops   (07.04.2005 в 15:56)   письмо автору
 
   для: Shorr Kan   (07.04.2005 в 12:15)
 

Можно модернизировать скрипт по теме http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=1718
<?php 
  scan_dir
("."); 
  
// Смотрим что получилось
  
echo "<pre>";
  
print_r($arr);
  echo 
"</pre>";
  
////////////////////////////////////////////////////////// 
  // Рекурсивная функция - спускаемся вниз по каталогу 
  ////////////////////////////////////////////////////////// 
  
function scan_dir($dirname
  { 
    
globals $arr;
    
// Открываем текущую директорию 
    
$dir opendir($dirname); 
    
// Читаем в цикле директорию 
    
while (($file readdir($dir)) !== false
    { 
      
// Если файл обрабатываем его содержимое 
      
if($file != "." && $file != ".."
      { 
        
// Если имеем дело с файлом - регистрируем его 
        
if(is_file($dirname."/".$file)) 
        { 
          
$temp file($dirname."/".$file);
          
// Вытаскиваем третью строку из файла
          
$arr[] = $temp[3];
          
// Обнуляем массив
          
unset($temp);
        } 
        
// Если перед нами директория, вызываем рекурсивно 
        // функцию scan_dir 
        
if(is_dir($dirname."/".$file)) 
        { 
          echo 
$dirname."/".$file."<br>"
          
scan_dir($dirname."/".$file,$fd,$fb); 
        } 
      } 
    } 
    
// Закрываем директорию 
    
closedir($dir); 
  } 
?>

   
 
 автор: Shorr Kan   (08.04.2005 в 01:50)   письмо автору
 
   для: cheops   (07.04.2005 в 15:56)
 

Видимо, почти то, что нужно. Однако, мне ведь нужно взять первую строку из каждого файла в текущей директории, и записать в базу. Потом взять вторую... И т.д. Как их брать одновременно? Ну допустим, в переменную - и разделить "','" - чтоб потом при помощи INSERT можно было вставить.

p.s. Т.е., в смысле - как двигаться по строкам файла(ов)? А не конкретно "Третью строку". Если циклом построчно - то лично у меня получается сразу циклом по одному файлу. А ведь нужно циклом построчно со всех файлов в данном каталоге.

p.p.s. Кстати говоря, вышеданный код выдает немало ошибок, хотя globals я исправил на global, да и повторный вызов функции - убрал лишние входящие значения.... Все равно - ошибки.

   
 
 автор: cheops   (08.04.2005 в 09:34)   письмо автору
 
   для: Shorr Kan   (08.04.2005 в 01:50)
 

А да, взял первый скрипт не глядя, он должен выглядеть следующим образом
<?php 
  scan_dir
("."); 
  
// Смотрим что получилось 
  
echo "<pre>"
  
print_r($arr); 
  echo 
"</pre>"
  
////////////////////////////////////////////////////////// 
  // Рекурсивная функция - спускаемся вниз по каталогу 
  ////////////////////////////////////////////////////////// 
  
function scan_dir($dirname
  { 
    global 
$arr
    
// Открываем текущую директорию 
    
$dir opendir($dirname); 
    
// Читаем в цикле директорию 
    
while (($file readdir($dir)) !== false
    { 
      
// Если файл обрабатываем его содержимое 
      
if($file != "." && $file != ".."
      { 
        
// Если имеем дело с файлом - регистрируем его 
        
if(is_file($dirname."/".$file)) 
        { 
          
$temp file($dirname."/".$file); 
          
// Вытаскиваем третью строку из файла 
          
$arr[$dirname."/".$file][0] = $temp[0]; 
          
$arr[$dirname."/".$file][1] = $temp[1]; 
          
$arr[$dirname."/".$file][2] = $temp[2]; 
          
$arr[$dirname."/".$file][3] = $temp[3]; 
          
// Обнуляем массив 
          
unset($temp); 
        } 
        
// Если перед нами директория, вызываем рекурсивно 
        // функцию scan_dir 
        
if(is_dir($dirname."/".$file)) 
        { 
          echo 
$dirname."/".$file."<br>"
          
scan_dir($dirname."/".$file); 
        } 
      } 
    } 
    
// Закрываем директорию 
    
closedir($dir); 
  } 
?>

В результате получится двумерный массив $arr, первое измерение которого является именем файла, а вторая строкой - вы можете без труда сохранить любую строку файла, так как массив $temp - содержит все строки файла.

   
 
 автор: Shorr Kan   (08.04.2005 в 10:44)   письмо автору
 
   для: cheops   (08.04.2005 в 09:34)
 

Чего-то ничего не получается :(

Во-первых, у меня файлы gz... Но это я, вроде бы, поправил...
Во-вторых, я не умею работать с двумерными массивами. Я так понимаю, что это нужно что-то вроде print $arr[0][0]; ... Но он ругается в ответ.
В-третьих - а почему четыре?

$arr[$dirname."/".$file][0] = $temp[0]; 
          $arr[$dirname."/".$file][1] = $temp[1]; 
          $arr[$dirname."/".$file][2] = $temp[2]; 
          $arr[$dirname."/".$file][3] = $temp[3]; 

И почему третью строку? Вся суть в том, чтобы удалить все из таблицы mysql - беря все первые строки во всех файлах, сделать insert... Потом взять все вторые строки... Я пока что-то не очень понимаю, как эту функцию переделать под мои нужды.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования