За последние 24 часа нас посетили 17935 программистов и 1587 роботов. Сейчас ищут 1094 программиста ...

Удаление строк в php

Тема в разделе "PHP для новичков", создана пользователем Neptoon, 10 окт 2010.

  1. Neptoon

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

    С нами с:
    19 сен 2010
    Сообщения:
    16
    Симпатии:
    0
    Подскажите, как в php удалить из текстового файла, например, первые 100 строк?
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Neptoon
    никак. только сначала загрузить файл в память, похерить первые сто строк и записать новый файл.
    PHP:
    1. <?php
    2. $lines = file("C:\\Documents and Settings\\myfile.txt");
    3. foreach($lines as $line) {
    4.     echo($line);
    5. }
    6. ?>
    думаю, тут все ясно.

    остальное можно найти на php.net с примерами.
     
  3. Neptoon

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

    С нами с:
    19 сен 2010
    Сообщения:
    16
    Симпатии:
    0
    Нашел вот такой код
    Код (Text):
    1. $filename = 'test.txt'; // файл
    2. $delete = array(0, 2, 5); // номера строк, которые удаляем
    3.  
    4.  
    5. $file = file($filename, FILE_IGNORE_NEW_LINES);
    6. while(list($line, $data) = each($file))
    7. {
    8.     if(in_array($line, $delete))
    9.         unset($file[$line]);
    10. }
    11. $file = array_filter($file);
    12. file_put_contents($filename, implode("\n", $file), LOCK_EX);
    13. unset($file);
    Однако работает не правильно. Строки удаляет, но вот вместо перехода на новую строку появляется квадратик.
    Может кто-нибудь исправить код?
     
  4. WildZero

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

    С нами с:
    24 фев 2010
    Сообщения:
    242
    Симпатии:
    0
    Адрес:
    Пермь
    implode("\r\n", $file)
     
  5. Neptoon

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

    С нами с:
    19 сен 2010
    Сообщения:
    16
    Симпатии:
    0
    Спасибо, уже лучше. Еще заметил косяк. Как сделать, чтобы удалялась только нужная мне строка? Сейчас код удаляет все пустые строки, расположенные выше выбранной строки
     
  6. WildZero

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

    С нами с:
    24 фев 2010
    Сообщения:
    242
    Симпатии:
    0
    Адрес:
    Пермь
    Код (Text):
    1. $delete = array(0, 2, 5); // номера строк, которые удаляем
     
  7. Neptoon

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

    С нами с:
    19 сен 2010
    Сообщения:
    16
    Симпатии:
    0
    Ну это понятно. Вот только если в файле есть пустые строки (а они у меня есть, и они необходимы), то все равноони удаляются, несмотря на указанные к удалению номера строк
     
  8. WildZero

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

    С нами с:
    24 фев 2010
    Сообщения:
    242
    Симпатии:
    0
    Адрес:
    Пермь
    $file = file($filename)
     
  9. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    убери $file = array_filter($file);
     
  10. Neptoon

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

    С нами с:
    19 сен 2010
    Сообщения:
    16
    Симпатии:
    0
    сейчас код без $file = array_filter($file);

    Расскажу подробнее что мне надо. У меня есть форма. записывающая пользовательские данные в файл каждый раз с новой строки. Естественно, файл постоянно увеличивается. Так вот, надо удалять первую строку каждый раз, когда записывается новая (т.е. кол-во строк в файле всегда будет одинаковым). А выше представленный код удаляет верхние строки и одновременно удаляет с последней строки переход на новую строку. Таким образом получается, что новые данные записываются не с новой строки, а на последнюю. Мне надо с новой. Можете помочь?
    Даже заплачу, если поможете

    Косяк этого кода в том, что после открытия текстового файла все переходы на новую строку выглядят в виде квадратиков
     
  11. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Neptoon
    БД
     
  12. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Делается это очень-очень просто.
    fgets, fread, fwrite. Даже fseek не нужен.
     
  13. Neptoon

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

    С нами с:
    19 сен 2010
    Сообщения:
    16
    Симпатии:
    0
    Можешь это написать в виде кода?
     
  14. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    Neptoon
    может xD
     
  15. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Код тривиален
    PHP:
    1. <?php
    2. $file = file('fuck.txt');
    3. $result = array_slice($file, 100); // 100 это количество удаляемых строк
    4. file_put_contents('fuck.txt', implode($result), LOCK_EX);
    5. ?>
    Но тебе нужно не совсем это.
    Всё гениальное просто !!! (принцип KISS)
    PHP:
    1. <?php
    2. // Читаем файл
    3. $file = file('fuck.txt');
    4. // Добавляем новую строку
    5. $file[] = "новая строка которую мы пишем.\r\n";
    6. // Удаляем первую
    7. unset($file[0]);
    8. // Пишем файл
    9. file_put_contents('fuck.txt', implode($file), LOCK_EX);
    10. // В результате количество строк в файле всегда будет одинаково.
    11. ?>
     
  16. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    К.О.считает своим долгом заявить что последний код являестя самым элегантным решением
     
  17. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    igordata
    В этом топике да. Однако многое не учтено в этом коде, в частности проверки на то если "что-то пошло не так"

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

    И элегантнее (с точки зрения педанта) вместо unset сделать array_shift а так-же array_push вместо $file[]

    Опять же имя скрипта лучше сделать настраиваемым в начале файла...

    PHP:
    1. <?php
    2. // Имя файла
    3. $filename = 'fuck.txt';
    4. // Читаем файл
    5. $file = file($filename);
    6. // Добавляем новую строку
    7. array_push($array, "новая строка которую мы пишем.\r\n");
    8. // Удаляем первую
    9. array_shift($array);
    10. // Пишем файл
    11. $ok = file_put_contents($filename, implode($file), LOCK_EX);
    12. ?>
     
  18. Neptoon

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

    С нами с:
    19 сен 2010
    Сообщения:
    16
    Симпатии:
    0
    Всем спасибо!