Есть открытый текстовый файл, скажем, длинной в 100 строк. Необходимо дописать данные, скажем, в 79 строку (номер известен). Возможно ли такое средствами Lua, есть ли у кого пример реализации подобной функции?
Если требуется именно дописать, а не изменить, то для случая дописывания в конец строки самым простым представляется прочитать из файла, открытого как io.open( filename, "r+" ), N (=79) строк. Затем шагнуть назад file:seek( "cur", -EOL ), где EOL = "\n":len() - длина перевода на новую строку. А потом дописать с помощью file:write то, что Вам требуется. Для случая дописывания не в конец строки придётся искать позицию иначе.
Если файл создаётся периодически из того же кода, можно отдельно запоминать offset для file:seek нужного для дозаписи места.
Ага, только в этом случае все строки после 79й пропадут :) поэтому нужно все, что ниже сначала вычитать в память, а потом перезаписать 79ю и все последующие строки
vgi написал: Если требуется именно дописать, а не изменить, то для случая дописывания в конец строки самым простым представляется прочитать из файла, открытого как io.open( filename, "r+" ), N (=79) строк. Затем шагнуть назад file:seek( "cur", -EOL ), где EOL = "\n":len() - длина перевода на новую строку. А потом дописать с помощью file:write то, что Вам требуется. Для случая дописывания не в конец строки придётся искать позицию иначе.
Если файл создаётся периодически из того же кода, можно отдельно запоминать offset для file:seek нужного для дозаписи места.
Дело обстоит так. Файл открыт постоянно в работе скрипта - в него записывается информация об особых событиях (несколько десятков за сессию), с течением времени дописывается инфа об изменении цены с момента события (до часа). Ну точнее хочу чтобы дописывалась, -- продумываю реализацию. Можно конечно записывать строку целиком через час, но в случае остановки скрипта или других проблем она будет утеряна целиком.
Насколько понял, событий не ооочень много и частота дописываний тоже не hft. Может стоит пересмотреть процесс создания/записи файла? Например периодически полностью пересоздавать его ( данные в памяти ). Если не охота данные в памяти всё время держать, можно сохранять в не очень наглядном lua-формате, загружать с помощью dofile, дополнять и снова сливать в файл.
Иван Ру написал: Есть открытый текстовый файл, скажем, длинной в 100 строк. Необходимо дописать данные, скажем, в 79 строку (номер известен). Возможно ли такое средствами Lua, есть ли у кого пример реализации подобной функции?
Вашу задачу можно так: 1) Все записи делаем одинаковой длины, например 128 байт 2) Если запись короче 128 то добиваем ее либо пробелом либо нулями. 3) Если надо дописать, то ищем изменяемую запись , читаем ее, добавляем и пишем на свое место.
Иван Ру написал: Есть открытый текстовый файл, скажем, длинной в 100 строк. Необходимо дописать данные, скажем, в 79 строку (номер известен). Возможно ли такое средствами Lua, есть ли у кого пример реализации подобной функции?
Вашу задачу можно так: 1) Все записи делаем одинаковой длины, например 128 байт 2) Если запись короче 128 то добиваем ее либо пробелом либо нулями. 3) Если надо дописать, то ищем изменяемую запись , читаем ее, добавляем и пишем на свое место.
Возможно мы друг друга недопоняли. Записи я делаю в csv (текстовый) файл с разделителями в виде ";". Затем я его читаю в эксель. По-сути надо добавить дополнительные элементы данных в отдельные строки, де-факто они всегда оказываются ближе к концу файла. Кстати, попутный вопрос. Если у меня файл находится в открытом состоянии в режиме чтения-записи и его размер велик (скажем 100 мб.) -- отнимает ли это соответствующий объем оперативной памяти? Если да - как этого избежать? Только закрытием файла и повторным открытием для записи?
Николай Камынин написал: 3) Если надо дописать, то ищем изменяемую запись , читаем ее, добавляем и пишем на свое место.
Ну так-то обычно все данные после места записи обрезаются. Нельзя просто так взять и вставить запись внутрь файла ;)
Отличным решением был бы например маппинг файла в память, но, боюсь на луа это не доступно.
Цитата
Иван Ру написал: Если у меня файл находится в открытом состоянии в режиме чтения-записи и его размер велик (скажем 100 мб.) -- отнимает ли это соответствующий объем оперативной памяти?
Николай Камынин написал: 3) Если надо дописать, то ищем изменяемую запись , читаем ее, добавляем и пишем на свое место.
Ну так-то обычно все данные после места записи обрезаются. Нельзя просто так взять и вставить запись внутрь файла ;)
Отличным решением был бы например маппинг файла в память, но, боюсь на луа это не доступно.
Цитата
Иван Ру написал: Если у меня файл находится в открытом состоянии в режиме чтения-записи и его размер велик (скажем 100 мб.) -- отнимает ли это соответствующий объем оперативной памяти?
Нет, не отнимает.
Если будете правильно писать то данные не будут обрезаться. А вот память под файлы расходуется. т е "отнимает" Более того, если Вы не делаете выгрузку, то данные будут в памяти а не на диске.
Иван Ру написал: Есть открытый текстовый файл, скажем, длинной в 100 строк. Необходимо дописать данные, скажем, в 79 строку (номер известен). Возможно ли такое средствами Lua, есть ли у кого пример реализации подобной функции?
Вашу задачу можно так: 1) Все записи делаем одинаковой длины, например 128 байт 2) Если запись короче 128 то добиваем ее либо пробелом либо нулями. 3) Если надо дописать, то ищем изменяемую запись , читаем ее, добавляем и пишем на свое место.
Возможно мы друг друга недопоняли. Записи я делаю в csv (текстовый) файл с разделителями в виде ";". Затем я его читаю в эксель. По-сути надо добавить дополнительные элементы данных в отдельные строки, де-факто они всегда оказываются ближе к концу файла. Кстати, попутный вопрос. Если у меня файл находится в открытом состоянии в режиме чтения-записи и его размер велик (скажем 100 мб.) -- отнимает ли это соответствующий объем оперативной памяти? Если да - как этого избежать? Только закрытием файла и повторным открытием для записи?
память под файлы расходуется, но это не 100 мб и беспокоится не стоит. Попробую объяснить про дозапись. Есть два режима записи - бинарный и текстовый. В текстовом инфа пишется в файл последовательно запись за записью . Каждая строка пишется в формате ASCIZ, т е признак конца строки - это ноль. поэтому просто добавить в конец какой- либо, не последней, строки в файле невозможно, так как нет места для этого. Поэтому я Вам предложил сделать строки одинаковыми по длине - это ускорит поиск нужной строки и создать место для дозаписи. Т е Вы создаете пустое место на диске и пишите в это место . ---------------------------- Если Вы пишите в файл лишь для передачи в Excel, то это можно делать через протокол Dynamic Data Exchange (DDE) сразу в Excel. Но это требует знаний в написании DLL на СИ для Lua.