Кошки рулят
10.02.2015 - 04:51
Киньте хелпа, у меня уже идей нет ...
Есть файл-список iki.txt, нужно удалить из него строку определенного содержания
$login = "ляляля";
$file_array = file("./iki.txt");
if($file_array)
{
if ($file = fopen("./iki.txt","wt"))
{
$laststroka=count($file_array);
for($i=0; $i < $laststroka; $i++)
{
$tekstr=trim($file_array[$i]);
if ($tekstr <> $login)
{
fwrite($file, $tekstr."\n");
}
}
fclose($file);
print("1");
Результат: искомая строка удалена, все остальные строки задвоились(????).
Как будто цикл 2 раза выполнился.
В чем может быть причина?
volter9
10.02.2015 - 06:03
Кошки рулятЯ думаю легче будет сделать (как то так, не проверял):
$word = 'lalala';
$file = file_get_contents('./file.txt');
$file = str_replace($word, '', $file);
file_put_contents('./file.txt', $file);
_____________
Мой блог
Игорь_Vasinsky
10.02.2015 - 08:08
а если файл 500 Mb ?
тогда fgets() для построчного чтения
str_replace() - если данные в юникоде и попадётся кириллица - там может случиться беда - лучше strtr()
_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
volter9
10.02.2015 - 08:47
Игорь_Vasinsky
Я не хочу спорить, но если даже файл 500мб, я думаю, то ни file_get_contents, ни fgets не поможет т.к. скорей всего max_execution_time истечет или же кол-во разрешенной памяти (ну если это не какой нибудь CLI скрипт).
Цитата (Игорь_Vasinsky @ 10.02.2015 - 08:08) |
str_replace() - ... - strtr() |
Это две разные функции они делают разные вещи.
_____________
Мой блог
Игорь_Vasinsky
10.02.2015 - 09:30
Цитата |
str_replace() - ... - strtr() |
да ну )))
Цитата |
Я не хочу спорить, но если даже файл 500мб, я думаю, то ни file_get_contents, ни fgets не поможет |
ну да)))
_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Цитата (Кошки рулят @ 10.02.2015 - 00:51) |
В чем может быть причина? |
потому что скрипт дописывает данные в тот же файл откуда и читает. Нужно либо очищать файл iki.txt после $file_array = file("./iki.txt"), либо писать в другой файл.
Кошки рулят
10.02.2015 - 13:27
Цитата (kaww @ 10.02.2015 - 07:16) |
Нужно либо очищать файл iki.txt после $file_array = file("./iki.txt"), либо писать в другой файл. |
Я пишу
$file = fopen("./iki.txt","wt")
и расчитываю, что он откроется согласно мануалу
Цитата |
'w' Открывает файл только для записи; помещает указатель в начало файла и обрезает файл до нулевой длины. |
Может это дэнвер глючит?
И потом, если бы он дописывал, то получалось бы так:
Было:
куку
ляляля
муму
Стало бы:
куку
ляляля
муму
куку
муму
На самом деле получается так:
куку
муму
куку
муму
Цитата (Кошки рулят @ 10.02.2015 - 09:27) |
и расчитываю, что он откроется согласно мануал |
да, действительно, не обратил внимания, что w. Запустил у себя этот код - отработал нормально, т.е. удалил строку ляляля, ничего не "задвоилось". может все таки скрипт в посте и запускаемый скрипт отличаются? Т.к. в нем не хватает зарывающих скобок.
Кошки рулят
10.02.2015 - 14:23
Цитата (kaww @ 10.02.2015 - 09:45) |
может все таки скрипт в посте и запускаемый скрипт отличаются? Т.к. в нем не хватает зарывающих скобок. |
Я скопировал сюда свой рабочий код.
Видимо, все-таки Денвер косячит, потому что отладчик phpDesigner тоже отрабатывает этот код нормально.
Игорь_Vasinsky
10.02.2015 - 14:33
$login = "lalala";
$file = __DIR__."/iki.txt";
$handle = fopen($file, "r");
while (!feof($handle)) {
$buffer = fgets($handle, 4096);
if($login != $buffer)
$data[] = $buffer;
}
fclose($handle);
file_get_contents($file, $data);
_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Кошки рулят
10.02.2015 - 14:35
Цитата (Игорь_Vasinsky @ 10.02.2015 - 04:08) |
а если файл 500 Mb ? |
Файлы будут маленькие.
Это я тут на спор 1С:Виттер (или 1С:Таграм) делаю. Чтобы в 1С-е был какбытвиттер такой. Пока просто пилотный выпуск. (200 строк кода в 1С и 100 в php скрипте, включая все комментарии и пустые строки) Никакой промышленной эксплуатации это не предусматривает. Просто демонстрация принципа.
Кошки рулят
10.02.2015 - 14:54
Цитата (volter9 @ 10.02.2015 - 02:03) |
Кошки рулят Я думаю легче будет сделать (как то так, не проверял):
$word = 'lalala'; $file = file_get_contents('./file.txt'); $file = str_replace($word, '', $file); file_put_contents('./file.txt', $file); |
Кошки рулятЯ думаю легче будет сделать (как то так, не проверял):
$word = 'lalala';
$file = file_get_contents('./file.txt');
$file = str_replace($word, '', $file);
file_put_contents('./file.txt', $file);
Не прокатит
Это список уникальных логинов, нужно найти заданный логин и удалить из списка. А этот код удалит не только сам логин, но и куски других логинов.
Т.е. если был список
ропонеlalala фф
lalala
lalala1
231lalala
, то после твоего кода останется
ропоне фф
1
231
,а должно остаться
ропонеlalala фф
lalala1
231lalala
volter9
10.02.2015 - 19:48
Кошки рулятНу тогда можно так:
$word = 'lalala';
$lines = explode("\n", file_get_contents('./iki.txt'));
$file = array_filter($lines, function ($line) use ($word) {
return $line !== $word;
});
file_put_contents('./file.txt', implode("\n", $file));
Или вариант как у Игорь_Vasinsky.
_____________
Мой блог
Кошки рулят
10.02.2015 - 20:12
Цитата (volter9 @ 10.02.2015 - 15:48) |
Ну тогда можно так Или вариант как у Игорь_Vasinsky. |
Можно конечно, и так и по-всякому. Суть от этого не меняется - каким способом перебирать строки, записывая нужные и выкидывая не нужную.
Совершенно не понятно почему мой код так чуднО выполняется.
Причем, аналогичный код в действующей игрушке (Снеговик) работает. А вся разница в том, что там не целиком строка ищется, а проверяется вхождение заданного текста в строку. Т.е., разница только в условии. При этом условие явно выполняется - в результирующем файле заданной строки действительно нет.
FatCat
10.02.2015 - 21:42
Цитата (volter9 @ 10.02.2015 - 05:03) |
$file = str_replace($word, '', $file); |
Чтобы удаляло только целую строку, надо:
$file = str_replace(PHP_EOL.$word.PHP_EOL, PHP_EOL, $file);
_____________
Бесплатному сыру в дырки не заглядывают...
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.