1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | -- Флаг поддержания работы скрипта IsRun = true; function main() -- Пытается открыть файл в режиме "чтения/записи" f = io.open(getScriptPath().."\\Test.txt","r+"); -- Если файл не существует if f == nil then -- Создает файл в режиме "записи" f = io.open(getScriptPath().."\\Test.txt","w"); -- Закрывает файл f:close(); -- Открывает уже существующий файл в режиме "чтения/записи" f = io.open(getScriptPath().."\\Test.txt","r+"); end; -- Записывает в файл 2 строки f:write("Line1\nLine2"); -- "\n" признак конца строки -- Сохраняет изменения в файле f:flush(); -- Встает в начало файла -- 1-ым параметром задается относительно чего будет смещение: "set" - начало, "cur" - текущая позиция, "end" - конец файла -- 2-ым параметром задается смещение f:seek("set",0); -- Перебирает строки файла, выводит их содержимое в сообщениях for line in f:lines() do message(tostring(line));end -- Закрывает файл f:close(); -- Цикл будет выполнятся, пока IsRun == true while IsRun do sleep(100); end; end; function OnStop() IsRun = false; end; |
Если у Вас появились какие-то вопросы, задайте их в комментариях под статьей !!!
Здравствуйте. Такой код:
но почему-то в файле так ничего и не записывается... в чем причина?
Здравствуйте! А почему w без кавычек?
здравствуйте. подскажите как удалить файл? и где можно посмотреть какие вообще есть команды работы с файлами?
как из файла удалить часть текста, определенную строку?
Здравствуйте! Для удаления файла используйте командную строку, пример ее использования:
о том какие команды поддерживает командная строка и какой у них синтаксис можете найти в интернете, я просто не помню, т.к. редко появляется необходимость. Чтобы удалить часть текста из файла, нужно перезаписать файл новым текстом без этой части.
Здесь можете ознакомиться с функциями, которые предоставляет Lua для работы с файлами: http://www.lua.ru/doc/5.7.html
не очень понял как удалить файл, можно на примере как у вас выше в примерах работы с файлами описано ?
Погуглите что такое командная строка Windows и какие есть команды, я не помню конкретно как файл удалить, мне так же гуглить придется. Если Вы решили заняться программированием, то не ленитесь получать новые знания и осваивать новые технологии, все пригодится когда-то.
Здравствуйте.
создаю файл с расширением ".csv", задача такая, при запуске скрипта он должен запись делать в конце файла с новой строки, по мере работы скрипта эта строка должна перезаписываться. скрипт останавливаем всё сохраняем. при следующем запуске всё так же, запись делается в конце файла с новой строки, по мере работы скрипта эта строка должна перезаписываться.
t_file:seek("end",0)
t_file:write("\n"..os.date()..";".."0"..";".."0")
t_file:flush()
, далее в скрипте нужно эту строку заменить на новую, вот не пойму как это сделать?
и ещё,
f:seek("set",0) из вашего примера, вот смешение на 0, что вообще значит смещение, и в чём оно измеряется? если поставить 10 то что и на сколько должно сместится?
Здравствуйте, это смещение по символам, как курсор в текстовом редакторе ("set", 0) значит в самое начало (сместиться на 0 символов относительно начала), ("end", 0) значит в самый конец (сместиться на 0 символов относительно конца). Для Вашей задачи нужно просто запоминать позицию начала последней строки:
а потом перезаписывать эту строку вставая в запомненную позицию
Только имейте в виду, что если Вы затираете более длинную строку более короткой, то в файле остануться символы от предыдущей строки.
У меня маленький отрывок из программы:
require "QL" -- подключаем библиотеку
require "iuplua" -- подключаем библиотеку
--задаем глобальные переменные
is_run=false --переменна для запуска-остановки функции main
time_period=1 --задаём частоту обращений к таблице параметров
Пожалуйста подскажите мне где взять библиотеку, модуль "QL" ???? другую библиотеку(require "iuplua") я нашёл уже.
Это библиотека украинских ребят, сейчас ее нет вроде, https://forum.quik.ru/forum10/topic2115/ Но можно сделать замену функций.
Здравствуйте. что б можно было открыть файл для просмотра когда скрипт ещё работает и записывает туда данные, нужно в скрипте именно открыть уже существующий файл в режиме "чтения/записи", и после каждой записи данных в файл сохранять - f:flush(), и тогда я смогу открыть и просмотреть файл без остановки скрипта? или можно создать файл в режиме "записи", так же сохранять f:flush() и тоже можно будет просматривать?
как лучше и есть ли разница?
Здравствуйте, открывать файл в режиме чтения Вы можете в любом случае.
но там файл пуст, надо просто добавить f:flush() и всё?
Просто откройте в режиме записи и он появится.
А если файл уже есть, но он пуст, то когда Вы его откроете, то увидите, что он пуст, не понимаю в чем проблема 🙂
f:flush() записывает данные из буфера в файл, т.е. когда Вы пишите что-то в файл, данные пишутся не сразу в файл, а в буфер, когда буфер заполняется данные автоматически сохраняются из него в файл и буфер освобождается для новых данных, если Вам нужно, чтобы данные сразу писались в файл, то после команды записи f:write('тут что-то') вызывайте f:flush(), чтобы принудительно отправить данные из буфера в файл, не дожидаясь когда буфер наполнится.
вот, последний комент в точку)
спасибо
Всегда пожалуйста 🙂
Добрый день, подскажите пожалуйста, как добраться до директории находящейся перед той, где лежит скрипт?
Т.е. на одну выше, чем выдает getScriptPath().
Добрый день, вот так можно:
Добрый день! Подскажите, как можно удалять файл после выполнения скрипта?
Добрый день! os.remove(path), только закройте его перед удалением.
Добрый день . Решил написать скрипт на луа))) . Рыбу взял из простого примера с использованием файлов iuplua и QL.lua. если первый файл я прикрутил, то ql ни как не получается. Может кто подскажет, я вижу тут многие его знают))
Добрый день, поместите библиотеку в основной каталог терминала, туда где info.exe
Так и сделал, C:\Program Files (x86)\Info\MYLUA\new 1.lua:7: module 'QL' not found:
no field package.preload['QL']
no file 'c:\lua\5.1\lua\QL.lua'
no file 'c:\lua\5.1\clibs\QL51.dll'
no file 'c:\lua\5.1\clibs\QL.dll'.
приэтом файла QL.dll нет в природе.
может привязка мешает- пример из скрипта
package.cpath=";;c:\\lua\\5.1\\clibs\\?51.dll;c:\\lua\\5.1\\clibs\\?.dll;"
package.path=";;c:\\lua\\5.1\\lua\\?.lua;"
А у Вас LuaForWindows установлена на компьютере?
да, я его скачал, установил по адресу c:\Program Files (x86)\Lua5.1\
хотя я уже и не уверен , что такое luaforwind.? куча релизов, куча переделок, где и что брать? вариаций 5,1длл тьма...
Измените эту строку:
вот так:
спс, сейчас попробую))
C:\Program Files (x86)\Info\MYLUA\new 1.lua:9: module 'QL' not found:
no field package.preload['QL']
no file 'c:\lua\5.1\lua\QL.lua'
no file 'C:\Program Files (x86)\Info\QL.dll'
no file 'c:\lua\5.1\clibs\QL51.dll'
no file 'c:\lua\5.1\clibs\QL.dll'
меня смущает поиск файла QL.dll. а ведь там QL.luac и QL.lua
А, если там не dll, то конечно, я просто сам не пользуюсь QL, потому не помню, тогда еще вот эту строку
замените на
Можете даже вот так сделать:
При этом, QL.dll должен находится там же, где info.exe
Ну и подключать так:
C:\Program Files (x86)\Info\MYLUA\new 1.lua:9: module 'QL' not found:
no field package.preload['QL']
no file 'c:\lua\5.1\lua\QL.lua'
no file 'C:\Program Files (x86)\Info\QL.dll'
no file 'c:\lua\5.1\clibs\QL51.dll'
no file 'c:\lua\5.1\clibs\QL.dl
меня смущает поиск файла QL.dll. а ведь там QL.luac и QL.lua, господи, как тяжело начинать))) косяк на уровне таблицы умножения....
ошибок стало больше-
C:\Program Files (x86)\Info\QL.lua:6: module 'socket' not found:
no field package.preload['socket']
no file 'C:\Program Files (x86)\Info\socket.lua'
no file 'c:\lua\5.1\lua\socket.lua'
no file '.\socket.lua'
no file 'C:\Program Files (x86)\Lua\5.1\lua\socket.lua'
no file 'C:\Program Files (x86)\Lua\5.1\lua\socket\init.lua'
no file 'C:\Program Files (x86)\Lua\5.1\socket.lua'
no file 'C:\Program Files (x86)\Lua\5.1\socket\init.lua'
no file 'C:\Program Files (x86)\Lua\5.1\lua\socket.luac'
no file 'C:\Program Files\Lua\5.1\lua\socket.lua'
no file 'C:\Program Files\Lua\5.1\lua\socket\init.lua'
no file 'C:\Program Files\Lua\5.1\socket.lua'
no file 'C:\Program Files\Lua\5.1\socket\init.lua'
no file 'C:\Program Files\Lua\5.1\lua\socket.luac'
no file '.\socket.dll'
no file '.\socket51.dll'
no file 'C:\Program Files (x86)\Lua\5.1\socket.dll'
no file 'C:\Program Files (x86)\Lua
Ну, QL теперь скрипт видит, это уже хорошо 🙂 Сейчас он файлы LuaForWindows не там ищет. Попробуйте обе строки закомментировать package.cpath и package.path, что он выдаст?
то же самое C:\Program Files (x86)\Info\QL.lua:6: module 'socket' not found:
no field package.preload['socket']
no file 'C:\Program Files (x86)\Info\socket.lua'
no file 'c:\lua\5.1\lua\socket.lua'
no file '.\socket.lua'
no file 'C:\Program Files (x86)\Lua\5.1\lua\socket.lua'
no file 'C:\Program Files (x86)\Lua\5.1\lua\socket\init.lua'
no file 'C:\Program Files (x86)\Lua\5.1\socket.lua'
no file 'C:\Program Files (x86)\Lua\5.1\socket\init.lua'
no file 'C:\Program Files (x86)\Lua\5.1\lua\socket.luac'
no file 'C:\Program Files\Lua\5.1\lua\socket.lua'
no file 'C:\Program Files\Lua\5.1\lua\socket\init.lua'
no file 'C:\Program Files\Lua\5.1\socket.lua'
no file 'C:\Program Files\Lua\5.1\socket\init.lua'
no file 'C:\Program Files\Lua\5.1\lua\socket.luac'
no file '.\socket.dll'
no file '.\socket51.dll'
no file 'C:\Program Files (x86)\Lua\5.1\socket.dll'
no file 'C:\Program Files (x86)\Lua
Видите, проблема в том, что у Вас расположение c:\Program Files (x86)\Lua5.1\, а скрипт ищет в C:\Program Files (x86)\Lua\5.1\ попробуйте это исправить у себя расположение, если и это не поможет, то лучше обратитесь к разработчикам QL, думаю, они не откажут в помощи.
спс. постараюсь найти решение, а вот разработчики ql вроде как пропали.... но я думаю решу )))
Спасибо, теперь данные построчно складываются в файле, но все таки чтобы посмотреть изменение в файле, его нужно закрыть и потом опять открыть, так сказать "онлайн" не отображаются добавленные строки.
Это уже зависит от программы, которой Вы просматриваете файл. Хотя, даже не знаю какие программы отображают изменения файла в реальном времени. Можете в Notepad++ попробовать открыть, только, если Вам нужно смотреть в реальном времени изменения, проще выводить их в таблицу.
Добрый день!
Спасибо за такой полезный ресурс. Есть вопросик.
Допустим есть csv файл, вида:
SBER; Сбербанк; 10
SBERP; Сбербанк-п; 20
ROSN; Роснефть; 120
и т.д.
Как заменить какое-либо значение в нем не нарушая структуры? Например, нужно у SBERP поменять 20 на 130.
Считывать информацию из файла я научился, благодаря вашим постам, а вот с изменением затык прям какой-то.
Заранее благодарен.
Здравствуйте, пожалуйста.
Вам придется перезаписывать файл, по крайней мере, начиная со строки изменения. Потому что в файле нет, как таковых, отдельных строк, а содержание файла примерно следующее:
"SBER; Сбербанк; 10\nSBERP; Сбербанк-п; 20\nROSN; Роснефть; 120\n"
По этому, если даже Вы напишите функцию, которая будет ставить указатель при помощи file.seek() в нужную позицию для перезаписи значения, то по Вашему примеру файл станет такой:
"SBER; Сбербанк; 10\nSBERP; Сбербанк-п; 130nROSN; Роснефть; 120\n"
И при следующем чтении строк f:lines() "Сбербанк-п; 130nROSN; Роснефть; 120" будет прочитана как одна строка, потому что символ переноса строки "\n" будет затерт.
Думал уже над таким решением. Надеялся, что найду более лаконичное решение. Похоже все таки придется рассмотреть этот вариант.
Можно, конечно, решить эту проблему, например, добавив пустой столбец в конце, заполненный пробелами, и корректировать его размер тоже, меняя какое-то значение в данной строке, создав для этого функцию записи значения в определенный столбец определенной строки. Тогда не нужно будет перезаписывать весь файл каждый раз.
Хм.. Как вариант, можно попробовать и так. Спасибо за подкинутую идею!
Всегда пожалуйста.
Здравствуйте.
Для ваших целей используйте библиотеку luacom: https://quik2dde.ru/viewforum.php?id=15
Дополнительно Вам понадобится библиотека w32 с одноименного сайта.