PHP читает данные из нескольких текстовых файлов, выводя определенную строку из всех файлов? - PullRequest
0 голосов
/ 24 августа 2011

Я пытаюсь написать скрипт, который читает содержимое 25 тяжелых текстовых файлов (около 100 строк каждый).Я хочу, чтобы мой скрипт выводил строку 5 каждого текстового файла.Я также работаю на рабочей станции Windows (использую Apache в локальной среде для тестирования).

Каждый текстовый файл находится в одном и том же каталоге (то есть products / product1.txt), который, как мне кажется, облегчает его.

Каждый текстовый файл в строке 5 выглядит следующим образом (с различными описаниями):

Product Desc: iphone

Я также хотел бы знать, возможно ли после достижения вышеизложенного иметь сценарийудалите текст «Product Desc:», чтобы отображалось только фактическое описание продукта.

Пожалуйста, предоставьте любые примеры кода, поскольку я новичок:)

Ответы [ 4 ]

1 голос
/ 24 августа 2011
$dir = opendir('directory');
while($file = readdir($dir)){
   if ($file != "." or $file != ".."){
      $opened = file($file);
      echo $opened[4]."<br />";
   }
}
0 голосов
/ 24 августа 2011

Ответ: http://pastebin.com/WBBQW9wA (необработанный код внизу)

Процесс трехкратный.

  1. Получить все имена файлов в каталоге.
  2. Читать в пятой строке каждый файл.
  3. Разделить после двоеточия.

MyМетод очень хорошо документирован и понятен. Он использует функции для выполнения определенных частей процесса.Это довольно легко понять, что происходит, и в то же время довольно устойчиво.


Функции, которые делают работу:

<?php
    function readAfterColon($string) {
    /**
     * @param string $string The string you'd like to split on.
     * 
     * @return string The data after the colon.  Multiple colons work just fine.
     */
    $array = explode(":",$string, 2);
    return isset($array[1]) ? $array[1] : '';
    }

    function readLine($lineNumber, $fileName) {
        /**
         * @param int $lineNumber The line number you want to read from the file.
         * @param string $fileName The string representing the file you wish to open.
         * 
         * @return string The contents of the line in the file.
         */
        $file = file($fileName);
        return $file[$lineNumber-1];
    }

    function readLineFrom($lineNumber, $fileNames) {
        /**
         * @param int $lineNumber The line number you want to read from the file.
         * @param string|array $files Either a string for the file you want to open, or an array of filenames.
         * 
         * @return array An associative array of the filename to the contents of the line.
         */
        $lines = array();
        if(is_array($fileNames)) {
            foreach($fileNames as $fileName) {
                $lines[$fileName] = readLine($lineNumber, $fileName);
            }
        } else {
            $lines[$fileNames] = readLine($lineNumber, $fileNames);
        }

        return $lines;
    }

    function getFileNamesFromDirectory($directory = '.') {
        /**
         * @param string $directory The path to directory you'd like to get filenames from. Defaults to current directory.
         * 
         * @return array An array of filenames.  Empty if there are no files.
         */
        $fileNames = array();
        if ($handle = opendir($directory)) {
            while (false !== ($file = readdir($handle))) {
                if ($file != "." && $file != "..") {
                    $fileNames[] = $directory . $file;
                }
            }
            closedir($handle);
        }
        return $fileNames;
    }

?>

Пример:

<code><?php
    //include the functions, then:
    //get the line from every file
    $descriptions = readLineFrom(5, getFileNamesFromDirectory('/var/www/test/'));

    //get the contents after the colon
    foreach($descriptions as $fileName=>$description) {
        $descriptions[$fileName] = readAfterColon($description);
    }

    //display it
    echo "<pre>\n";
    print_r($descriptions);
    echo "
";?>
0 голосов
/ 24 августа 2011

Итак, по сути, это три части: (1) вам нужно перебрать каталог, (2) прочитать в пятой строке каждого файла и (3) вам нужно прочитать раздел этой строки после двоеточия.

  // open the products directory  
  $fileHandle = opendir('products');

  // create an array to store the file data
  $files = array();

  // create an array to store products
  $products = array();

  if ($fileHandle) {
    // loop through each file
    while ( false !== ($singleFile = readdir($fileHandle)) ) {

      // use file() to read the lines of the file
      $lines = file($singleFile);

      // store the fifth line in each file (the array starts at 0)
      $productDescription = explode(":",$lines[4]);
      $products[] = productDescription[1]; // the bit after the colon
    }
  }

  // this should show you an array of the products
  print_r($products);
0 голосов
/ 24 августа 2011

PHP для загрузки нескольких файлов:

<?php
date_default_timezone_set("America/Edmonton");
$products=array();
$dir="../products/"; //Set this for whatever your folder


function getProduct($file) {
    $fp=fopen($file,"r");
    //Read five lines
    for ($j=0;$j<5;$j++) $line=fgets($fp);
    $GLOBALS["products"][]=substr($line,14);//Since products is a global var
    fclose($fp);
}

$dp=opendir($dir);
while (($file = readdir($dp)) !== false) {
  if ($file!="." && $file!="..")
    getProduct($dir.$file);
}
closedir($dp);

//Review the product list
print_r($products);
?>

Файл примера (one.txt):

line 1
line 2
line 3
line 4
Product Desc: iPhone
line 6

Ярлыки:

Поскольку нам нужна только пятая строка, мы используем цикл $j для чтения первых пяти строк, каждая из которых перезаписывает последнюю. Если файл меньше пяти строк, вы получите null из $line ... вам следует проверить это (а не добавлять его в список продуктов). Наконец, поскольку мы теперь имеем длину строки "Product Desc:" (как вы ее написали), мы можем просто выбросить эту первую часть строки. Это не ужасно надежно, лучше использовать RegEx или разбор строк, чтобы убедиться, что есть правильные слова, а затем использовать данные после двоеточия. Тем не менее ... он отвечает на ваш оригинальный вопрос;)

Вы сказали, что может быть намного больше строк, этот подход загружает в память только первые 5 строк (каждая поверх записи последней) и останавливается после достижения пятой строки ... что означает серьезные преимущества в производительности и памяти по сравнению с чтением весь файл в массив (file) и затем только с использованием строки 5.

Проектные решения:

Похоже, вы создаете каталог продуктов, было бы гораздо лучше использовать базу данных для хранения этих данных. Это не должно быть большим делом (MySQL, PostgreSQL), это может быть что-то столь же простое, как SQLite.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...