За последние 24 часа нас посетили 17684 программиста и 1727 роботов. Сейчас ищут 969 программистов ...

Считывание из файла

Тема в разделе "Прочие вопросы по PHP", создана пользователем nurbek, 14 июл 2008.

  1. nurbek

    nurbek Активный пользователь

    С нами с:
    11 июл 2008
    Сообщения:
    76
    Симпатии:
    0
    Адрес:
    Bishkek, KGZ
    У меня есть очень большой текстовый файл.
    Надо оттуда корректно считать данные и отделить друг от друга,
    следующим образом

    Код (Text):
    1.  
    2.  
    3. {post}
    4. Заголовок 1
    5. Автор 1
    6. Текст 1
    7.  
    8. {post}
    9. Заголовок 2
    10. Автор 2
    11. Текст 2
    12. .
    13. .
    14. .
    15. {post}
    16. Заголовок n
    17. Автор n
    18. Текст n
    19.  
    т.е. взять заголовок 1 обработать, взять автора-обработать, наконец взять оставшийся текст и тоже обратотать и так далле до следующего {post} и начать обработку заново и так до конца файла

    Заголовок и автор будут всегда на разных сторках, а текст это следующего {post}

    я начал дело, но до конца ни ума, ни опыта не хватает
    PHP:
    1.  
    2.  $fr = fopen( $filename, 'r') or die ("Error! Couldn't open the file.<br>");
    3.  while( !feof($fr) )
    4.  {
    5.     $line = fgets($fr);
    6.     if(trim($line) == "{post}")
    7.      {
    8.            // обработка......
    9.       }
    10.   }
    11.  
    Правильно ли я подошел к реализации или нет?
     
  2. Cron

    Cron Активный пользователь

    С нами с:
    10 июл 2008
    Сообщения:
    289
    Симпатии:
    0
    Адрес:
    Украина, Сумы
    Если так как у тебя в примере: между ТЕКСТ n и {POST} всегда есть пустая строка пробелов и в самом ТЕКСТ n подобной строки точно не встретиться, то правильно. В //обработка нужно заключить проверку, которая при нахождении строки пробелов собственно закончит обработку :)
    Весь блок //обработка - корректнее вынести в отдельную функцию.
     
  3. nurbek

    nurbek Активный пользователь

    С нами с:
    11 июл 2008
    Сообщения:
    76
    Симпатии:
    0
    Адрес:
    Bishkek, KGZ
    строка {post} будет встречатся только отдельно.

    так у меня возник вопрос,
    допустим я обработал материал, то потом как начать поиск не с самого места разьеденния,
    а с места где я закончил обработку и еще... как правильно реализовать поиск уже в самом отдельно взятом куске материала?
     
  4. Cron

    Cron Активный пользователь

    С нами с:
    10 июл 2008
    Сообщения:
    289
    Симпатии:
    0
    Адрес:
    Украина, Сумы
    Все зависит от того, куда вы обрабатываете - в массив, в БД, может в другие файлы...
    Что вы понимаете под МЕСТОМ РАЗЪЕДИНЕНИЯ и местом, где вы ЗАКОНЧИЛИ ОБРАБОТКУ?
     
  5. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    nurbek
    Не совсем понял структуру, но надеюсь, что понял правильно.
    PHP:
    1.  
    2. <?php
    3. $file = file_get_contents("text.txt"); //берем файл в строку
    4. $data = explode("{post}", $file); //Получаем массивы с текстами
    5. $data_size = sizeof($data);
    6. //А теперь обрабатываем каждый текст
    7. for ($i = 1; $i < $data_size; $i++) { //Здесь именно начало с 1, т.к. у нас первой строкой идет {post}, то до нее пустота считается 0 элементном
    8.    $parts = explode("\r\n", trim($data[$i]), 3); //Разбиваем тексты на заголовок, автора и текст
    9.    //Можно так:
    10.    list($title, $author, $text) = explode("\r\n", $data[$i], 3);
    11.    $texts[$i]["title"] = $parts[0];// (или $title)
    12.    $texts[$i]["author"] = $parts[1];
    13.    $texts[$i]["text"] = $parts[2];
    14. }
    15. ?>
    16.  
    Результат:
    [sql]
    Array
    (
    [1] => Array
    (
    [title] => Заголовок 1
    [author] => Автор 1
    [text] => Текст 1
    )

    [2] => Array
    (
    [title] => Заголовок 2
    [author] => Автор 2
    [text] => Текст 2
    )

    [3] => Array
    (
    [title] => Заголовок n
    [author] => Автор n
    [text] => Текст n
    )

    )
    [/sql]
     
  6. Cron

    Cron Активный пользователь

    С нами с:
    10 июл 2008
    Сообщения:
    289
    Симпатии:
    0
    Адрес:
    Украина, Сумы
    Не много интереснее будет, если ТЕКСТ может быть многострочным.
     
  7. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Cron
    Проверьте, прежде, чем говорить.
     
  8. Cron

    Cron Активный пользователь

    С нами с:
    10 июл 2008
    Сообщения:
    289
    Симпатии:
    0
    Адрес:
    Украина, Сумы
    В данный момент не где :( Будет возможность посмотрю обязательно.
    ...а понял, не увидел с ходу последний параметр 3.
     
  9. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Именно так, очень хороший параметр :)
     
  10. nurbek

    nurbek Активный пользователь

    С нами с:
    11 июл 2008
    Сообщения:
    76
    Симпатии:
    0
    Адрес:
    Bishkek, KGZ
    Kreker говорит
    Вообще то этот скрипт преднозначался для автоматического обновления контента, т.е. вместо того чтобы 100 статей тыкать в Tinymce, мы просто решили написать это в файл и потом загрузить файл в базу.
     
  11. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    nurbek
    Я думаю, что получившийся массив куда легче будет забить в базу простым циклом... Или должна быть определенная периодичность?
     
  12. nurbek

    nurbek Активный пользователь

    С нами с:
    11 июл 2008
    Сообщения:
    76
    Симпатии:
    0
    Адрес:
    Bishkek, KGZ
    to Сreker
    нет не надо никакой периодичнсти,
    да Вы правы мы прям в FOR-е и будем забивать.
    Спасибо за код, но я чуть подправил т.к. text выводится без ENTER-ов:
    PHP:
    1. <?php
    2.  $filename = trim($_POST['filename']); 
    3.  $file = file_get_contents($filename);  //берем файл в строку
    4.  $data = explode("{post}", $file);      //Получаем массивы с текстами
    5.  $data_size = sizeof($data);
    6.  //А теперь обрабатываем каждый текст
    7.  //Здесь именно начало с 1, т.к. у нас первой строкой идет {post}, то до нее пустота считается 0 элементном
    8.  for ($i = 1; $i < $data_size; $i++) {
    9.     $parts = explode("\r\n", trim($data[$i]), 3); //Разбиваем тексты на заголовок, автора и текст
    10.     $texts[$i]["title"]     = $parts[0];// (или $title)
    11.     $texts[$i]["author"]    = $parts[1];
    12.     $texts[$i]["text"]  = $parts[2];
    13.     $texts[$i]['text'] = explode("\r\n", trim($texts[$i]['text']));
    14.     echo "<strong>Title</strong>: ".$texts[$i]['title']."<br>";
    15.     echo "<strong>Author</strong>: ".$texts[$i]['author']."<br>";
    16.             echo "<strong>Text</strong>: <br>";
    17.     for($j = 0; $j < sizeof($texts[$i]['text']); $j++)
    18.     {
    19.         echo $texts[$i]['text'][$j]."<br>";
    20.     }
    21.     echo "<br>";
    22.     }
    23. ?>
    24.  
    Вопрос:
    Как Вы думаете различны ли будут нагрузки на БД при таком вводе через файл, чем при вводе через Tinymce, если бы мы вводили текст одинакового же размера?[/b]
     
  13. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    nurbek
    На самом деле это лишнее. Не нужно разбивать текст на массив, чтобы потом снова превратить массив в текст.
    Достаточно заменить \r\n в тексте на <br> с помощью функции strtr. А вообще, для таких целей есть функция nl2br, поэтому, строку $texts[$i]["text"] = $parts[2]; можно превратить в :
    $texts[$i]["text"] = nl2br($parts[2]);

    Вообще, стоит ли рассматривать нагрузку на бд при заполнении её инфой? Просто скрипт быстро закидает базу инфой с максимальной нагрузкой, а tinymce - надо будет вручную тыкать + он еще много обрабатывает текст...