из текстовика в дб, строки по разделителю

Тема в разделе "Как сделать...", создана пользователем E-body, 23 дек 2010.

Статус темы:
Закрыта.
  1. E-body

    E-body

    Регистр.:
    6 сен 2007
    Сообщения:
    980
    Симпатии:
    315
    Есть текстовик с содержимым:
    BRK
    Желаем искренне, сердечно
    Не знать волнений и помех,
    Чтоб сопутствовали вечно
    Здоровье, радость и успех.
    BRK
    С днём рожденья тебя поздравляем!
    Счастья в жизни большого желаем,
    Светлых дней и улыбок букет,
    Hе болеть, не стареть много лет!
    BRK
    Желаем море счастья,
    Капельку невзгод,
    Океан удачи, ручеек забот.
    BRK
    Тебе желаю жизни долгой,
    Желаю радости, тепла,
    И если уж печаль, — то только
    Легка пусть будет и светла.
    BRK
    ....
    php script выбирает записи по очередно где BRK как разделитель.
    PHP:
    $file "tkst.txt";
    $row_br "BRK";

    $db file($file);
    $row_num 0;
    for(
    $i=0;$i<count($db);$i++) {
     if(
    $row_br==$db[$i]) {$row_num++;}
     else {
    $row[$row_num] .= $db[$i];}
    }
     
    for(
    $c=0;$c<count($row);$c++) {

    $date date("d.m.y H:i"); 

     
    $query mysql_query ("SELECT `cmain` FROM `stihi` WHERE `cmain` = '".$row[$c]."' LIMIT 1");
     if(
    mysql_num_rows($query) > 0) {
      echo 
    "Информация в базе уже существует<br>";
     }
     else {
      
    mysql_query("INSERT INTO `stihi` VALUES('','avto','".$date."','0','".$row[$c]."','ok')");
      echo 
    "Информация в базу добавлена<br>";
     }
    }
    Работает, но выборку делает только примерно 5-ую часть, добавляя один пост а не множество по одиночке как надо.
    Требуется внесение записей в дб по одному стиху с понимаением разделителя указанного в переменной (в данном случае BRK)
     
  2. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.403
    Симпатии:
    1.185
    Вместо $db[$i] поставь
    trim($db[$i])
    или в строке $row_br = "BRK"; задавай переход на новую строку \r\n ну или тот который используешь.

    Второй баг $row_num = 0; замени на $row_num = -1;
     
    E-body нравится это.
  3. E-body

    E-body

    Регистр.:
    6 сен 2007
    Сообщения:
    980
    Симпатии:
    315
    не заценил ваше решение, серавно спасибки, пока свое наисали:
    PHP:
    ...
    $db implode(file($file));
    $row explode($row_br,$db);
    for(
    $i=0;$i<count($row);$i++) {....
    работает
     
  4. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.403
    Симпатии:
    1.185
    А зачем $db = implode(file($file));
    Лучше $db = file_get_contents($file); и работает быстрее, и корректно обработает некоректные переходы на новую строку
     
    E-body нравится это.
  5. diavolic

    diavolic

    Регистр.:
    17 мар 2010
    Сообщения:
    522
    Симпатии:
    102
    откуда информация что работает быстрее? кто то замерял скорость или целиком полагаемся на эмпирику?
     
  6. saen

    saen

    Регистр.:
    6 авг 2006
    Сообщения:
    756
    Симпатии:
    129

    http://www.raditha.com/wiki/Readfile_vs_include


    А у тебя быдлокод, это очевидно даже не только с точки зрения скорости, но из избыточности операций. Зачем считывать содержимое файла в массив а потом опять склеивать все это в строку?
     
  7. E-body

    E-body

    Регистр.:
    6 сен 2007
    Сообщения:
    980
    Симпатии:
    315
    Немного изменили код, который добавляет то что между границ. Но один косяк покачто не плучилось победить.
    Имеется код, берет из текстовика и все что между BRT то добавляет в дб и если строка не меньше 5 символов.
    PHP:
    $file "text.txt";
    $row_br "BRT";

    $db file_get_contents($file);
    $row explode($row_br,$db);

    for(
    $i=0;$i<count($row);$i++) {

     if(!empty(
    $row[$i]) && strlen($row[$i]) > 5) {
      
    $query mysql_query ("SELECT ...");
      if(@
    mysql_num_rows($query) > 0) {echo "Информация в базе уже существует<br>";}
      else {
    mysql_query("INSERT ... VALUES ...."); echo "Информация в базу добавлена<br>";}
     }
     else {echo 
    "Пустая Строка<br>";}
    }
    Косяк в том что он не добавляет материал полностью что находиться именно между BRT указателями. А перепрыгивает если предложение находятся через двойной Enter

    Требуется принудиельно указать что выбор информации идет сразу после BRT и до следующего BRT

    Условие if(!empty($row[$i]) && strlen($row[$i]) > 5) наверно лишнее влепил но без него никак ибо в дб добавит много пустышек
    -
    Может по регуларному выражени выбрку устроить...
    PHP:
    if (preg_match('|BRT(.*)BRT|sei'$str$arr)) $title $arr[1];
           else 
    $title='';
    регулярка правильная?)
     
  8. pitkina

    pitkina

    Регистр.:
    1 апр 2007
    Сообщения:
    253
    Симпатии:
    176
    для корректной работы с БД данные форматируются ф-ей mysql_real_escape_string (втч. новые строки заменяются на \r\n)
    и соответсвенно при двойном переносе без форматирования mysql вернет ошибку
    также если разделитель может отличаться лучше использовать preg_split

    PHP:
    $file "text.txt";
    $row_br "BRT";

    $db file_get_contents($file);
    $rows preg_split('|\s*'.preg_quote($row_br).'\s*|',$db,0,PREG_SPLIT_NO_EMPTY);

    $date date("d.m.y H:i");
    foreach(
    $rows as $row) if(strlen($row)>5) { $row=mysql_real_escape_string($row);
       
    $query mysql_query("SELECT `cmain` FROM `stihi` WHERE `cmain` = '".$row."' LIMIT 1");
       if(
    mysql_num_rows($query) > 0) echo "Информация в базе уже существует<br>";
       else { 
    mysql_query("INSERT INTO `stihi` VALUES('','avto','".$date."','0','".$row."','ok')");
       echo 
    "Информация в базу добавлена<br>"; }
       }
     
    E-body нравится это.
  9. serjinio

    serjinio

    Регистр.:
    10 май 2007
    Сообщения:
    439
    Симпатии:
    49
    readfile() память не жрёт в отличии от file_get_contents
     
  10. E-body

    E-body

    Регистр.:
    6 сен 2007
    Сообщения:
    980
    Симпатии:
    315
    Не понятно почему, но скрипт добавляет в дб только первую букву (если на русском, а английский тескт то нормально весь) содержимого внутри указателей ($row_br = "BRT";)
     
Статус темы:
Закрыта.