0 / 0 / 0
Регистрация: 01.10.2020
Сообщений: 6
|
||||||
1 | ||||||
Проверка на наличие строки в файле с последующей записью01.10.2020, 00:56. Показов 1793. Ответов 10
Здравствуйте, уважаемые пользователи форума. Только зарегистрировался, прошу простить меня, если вопрос будет некорректным.
Необходимо проверить наличие строки в файле crm.txt. Если строки нет, то записать строку в конец файла c новой строки. Для того, чтобы файл оставался легким, при достижении 10 строк, удалять первую запись. При работе с файлом, запретить запись другим процессом. Если искомая строка есть в файле, то ничего не делать.
http://192.168.0.10:5858/newor... riy&order=[{"menuid":"171","quant":"1.00"}] Помогите пожалуйста, несколько дней бьюсь, застрял на этом моменте, а время поджимает.
0
|
01.10.2020, 00:56 | |
Ответы с готовыми решениями:
10
Визуализировать DataTable и возможность добавления строки с последующей ее записью в файл Разделение строки на 2 подстроки с последующей записью последних в HashMap<String, String> Проверка на наличие записи в файле Проверка на наличие строчки в текстовом файле (ini иле txt) |
Невнимательный
|
|||||||||||
01.10.2020, 02:25 | 2 | ||||||||||
Если немного изменить пример из описания flock()
потом если нужно добавление уже блокировать и читать-проверять снова т.к. возможно между чтением и блокировкой кто-то уже перезаписал. Но если много процессов часто делают это с этим файлом, но мало туда пишут ... то даже не знаю ) может так и надо делать. Код не проверял, забэкапьте crm.txt Добавлено через 5 минут Проверил можно просто без проверки дёргать максимум 9 крайних элеиентов
0
|
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
|
|
01.10.2020, 11:55 | 3 |
Возможно лучше было бы c+, r+ не будет работать если файла нет
Если нужно только чтение, то использовать флаг LOCK_SH при блокировке, если еще и запись, то LOCK_EX
1
|
0 / 0 / 0
Регистрация: 01.10.2020
Сообщений: 6
|
|
01.10.2020, 23:10 [ТС] | 4 |
Спасибо за ответ!
Код работает только частично: запись в файл до 10 строк идет нормально. Однако самое главное в коде не выполняется, это проверка строки на наличие в файле. При обнаружении аналогичной строки запись не должна происходить, скрипт должен просто остановиться, однако в данном варианте кода запись продолжается. Может ли быть причина в самой строке? Может строку как-то модифицировать, чтобы проверка проходила успешно? Строка поступает в подобном виде, с разными или совпадающими параметрами: http://192.168.0.10:5858/newor... riy&order=[{"menuid":"171","quant":"1.00"}]
0
|
Невнимательный
|
|||||||||||
02.10.2020, 00:00 | 5 | ||||||||||
После строки
0
|
0 / 0 / 0
Регистрация: 01.10.2020
Сообщений: 6
|
|
02.10.2020, 00:19 [ТС] | 6 |
добавил, только не понимаю где посмотреть вывод от echo.
запись также продолжается.
0
|
Невнимательный
|
|
02.10.2020, 01:41 | 7 |
В браузере не вариант запустить ,) .... или из коммандной строки?
можно в файл какой-нибудь попробовать скинуть типа file_put_contents('test.txt', var_export($file, 1). "\n-----------\n". var_export($str, 1););
0
|
0 / 0 / 0
Регистрация: 01.10.2020
Сообщений: 6
|
|
03.10.2020, 01:00 [ТС] | 8 |
Вставил в код, теперь в файле test.txt пишет такие данные:
array ( 0 => '', 1 => 'http://192.168.0.10:5858/neworder?orderformattype=1&client=%D1%82%D0%B5%D1%81%D1%82&phone=+79876543210&st reet=%D0%A3%D0%BB%D0%B8%D1%86%D0%B0%3A&comment=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1 %87%D0%B0%D0%BD%D0%B8%D0%B5%3A&flatwarecount=1&order=[{"menuid":"253","quant":"1.00"}]', 2 => '', 3 => 'http://192.168.0.10:5858/neworder?orderformattype=1&client=%D1%82%D0%B5%D1%81%D1%82&phone=+79876543210&st reet=%D0%A3%D0%BB%D0%B8%D1%86%D0%B0%3A&comment=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1 %87%D0%B0%D0%BD%D0%B8%D0%B5%3A&flatwarecount=1&order=[{"menuid":"253","quant":"1.00"}]', 4 => '', 5 => 'http://192.168.0.10:5858/neworder?orderformattype=1&client=%D1%82%D0%B5%D1%81%D1%82&phone=+79876543210&st reet=%D0%A3%D0%BB%D0%B8%D1%86%D0%B0%3A&comment=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1 %87%D0%B0%D0%BD%D0%B8%D0%B5%3A&flatwarecount=1&order=[{"menuid":"253","quant":"1.00"}]', 6 => '', 7 => 'http://192.168.0.10:5858/neworder?orderformattype=1&client=%D1%82%D0%B5%D1%81%D1%82&phone=+79876543210&st reet=%D0%A3%D0%BB%D0%B8%D1%86%D0%B0%3A&comment=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1 %87%D0%B0%D0%BD%D0%B8%D0%B5%3A&flatwarecount=1&order=[{"menuid":"253","quant":"1.00"}]', 8 => '', 9 => 'http://192.168.0.10:5858/neworder?orderformattype=1&client=%D1%82%D0%B5%D1%81%D1%82&phone=+79876543210&st reet=%D0%A3%D0%BB%D0%B8%D1%86%D0%B0%3A&comment=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1 %87%D0%B0%D0%BD%D0%B8%D0%B5%3A&flatwarecount=1&order=[{"menuid":"253","quant":"1.00"}]', 10 => '', ) ----------- 'http://192.168.0.10:5858/neworder?orderformattype=1&client=%D1%82%D0%B5%D1%81%D1%82&phone=+79876543210&st reet=%D0%A3%D0%BB%D0%B8%D1%86%D0%B0%3A&comment=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1 %87%D0%B0%D0%BD%D0%B8%D0%B5%3A&flatwarecount=1&order=[{"menuid":"253","quant":"1.00"}]' Строка повторяется.
0
|
Невнимательный
|
|||||||||||
03.10.2020, 03:27 | 9 | ||||||||||
Только сейчас заметил... ... параметры наоборот, я тупо скопировал.
Должно быть так
... как-будто из-за того что у Вас в переменной $str перенос строки... вроде var_export() не показало в $tr перенос при чтении в массив стоит trim(fgets($fp)); в массиве сами строки без переносов ... поэтому добавляется где
$str не всегда без переноса, можно попробовать где-то в начале сделать $str=trim($str); Но можно переделать все эти места под работу только со строкой с перенсом
0
|
0 / 0 / 0
Регистрация: 01.10.2020
Сообщений: 6
|
||||||||||||||||
03.10.2020, 23:50 [ТС] | 10 | |||||||||||||||
Ура! Проверка строки на дубль работает, аналогичные строки не записываются.
Правда с переносом так и не разобрался, пустая строка все равно добавляется. И ещё, видимо из-за пустой строки счетчик сбивается, запись продолжала добавляться и дошла до 13 строк (больше не проверял). Пробовал вместо "r+" написать "a+", результат тот же. В самом начале кода как вы говорили, написал так: $str = trim($str); $file = array(); ... Пустая строка все равно добавляется. Может причина в этой строке: $file = array(); Привожу получившийся код целиком:
С пустой строкой разобрался: убрал один перенос строки:
И с количеством строк всё чётко. В общем, БОЛЬШОЕ СПАСИБО, x_lab, здорово помог! Теперь буду испытывать этот код на реальной работе с срм. Позже отпишусь. Добавлено через 1 минуту Для тех, кому может понадобится подобное решение:
0
|
Невнимательный
|
||||||||||||||||||||
04.10.2020, 01:07 | 11 | |||||||||||||||||||
в этой строке просто удаляется первый элемент массива, если элементов > 9
теоретически если добавлялось по две строки за раз, то количество строк росло. Но если-бы добавлялось по одной, то не превысило-бы 10 замена на такую строку
как-то странно... если использовалось trim($str) то почему fwrite() добавляло перенос. ... по fwrite() нашёл такое
если открывать с 'ab+' то да ... с одной стророны будет создаваться новый файл, если не существует по с другой стороныы перед чтением нужно будет выполнить
и неизвестно какоё могла быть рабочая директоория, а в fopen у Вас относительный путь к файлу и файл как-бы где-попало тоже не стоит создавать )) Добавлено через 51 минуту Можно попробовать 'cb+' вместо 'rb+'
и там какое-то странное приммечание с этим 'a+' что мол несмотря на fseek() запись всегда в конец файла Но наверное я-бы вместо "crm.txt" использовал-бы __DIR__.'/crm.txt' на всякий случай,) хоть и обычно не бывает разрешено создавать файлы где попало
0
|
04.10.2020, 01:07 | |
04.10.2020, 01:07 | |
Помогаю со студенческими работами здесь
11
Наличие строки в файле Проверка на наличие строки в БД Считать из файла с последующей записью в другой файл Проверка строки на наличие цифр Проверка на наличие строки в таблице Проверка строки на наличие символов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |