Запись в текстовый файл

Страницы: 1
RSS
Запись в текстовый файл, Нужно дописать данные в определенное место файла.
 
Есть открытый текстовый файл, скажем, длинной в 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, дополнять и снова сливать в файл.
 
Цитата
vgi написал:
формате, загружать с помощью dofile, дополнять и снова сливать в файл.
Тогда уж лучше/проще/удобнее прикрутить БД. Любую доступную.
Вот прямо в 100500 раз лучше будет.
 
Цитата
Иван Ру написал:
Есть открытый текстовый файл, скажем, длинной в 100 строк.
Необходимо дописать данные, скажем, в 79 строку (номер известен). Возможно ли такое средствами Lua, есть ли у кого пример реализации подобной функции?
Вашу задачу  можно так:
1) Все записи делаем одинаковой длины, например 128 байт
2) Если запись короче 128 то добиваем ее либо пробелом либо нулями.
3) Если надо дописать, то ищем изменяемую запись , читаем ее, добавляем и пишем на свое место.
 
 
Цитата
Николай Камынин написал:
Цитата
Иван Ру   написал:
Есть открытый текстовый файл, скажем, длинной в 100 строк.
Необходимо дописать данные, скажем, в 79 строку (номер известен). Возможно ли такое средствами Lua, есть ли у кого пример реализации подобной функции?
Вашу задачу  можно так:
1) Все записи делаем одинаковой длины, например 128 байт
2) Если запись короче 128 то добиваем ее либо пробелом либо нулями.
3) Если надо дописать, то ищем изменяемую запись , читаем ее, добавляем и пишем на свое место.
Возможно мы друг друга недопоняли. Записи я делаю в csv (текстовый) файл с разделителями в виде ";". Затем я его читаю в эксель. По-сути надо добавить дополнительные элементы данных в отдельные строки, де-факто они всегда оказываются ближе к концу файла.
Кстати, попутный вопрос. Если у меня файл находится в открытом состоянии в режиме чтения-записи и его размер велик (скажем 100 мб.) -- отнимает ли это соответствующий объем оперативной памяти? Если да - как этого избежать? Только закрытием файла и повторным открытием для записи?
 
Цитата
Николай Камынин написал:
3) Если надо дописать, то ищем изменяемую запись , читаем ее, добавляем и пишем на свое место.
Ну так-то обычно все данные  после места записи обрезаются.
Нельзя просто так взять и вставить запись внутрь файла ;)

Отличным  решением был бы например маппинг файла в память, но, боюсь на луа это не доступно.

Цитата
Иван Ру написал:
Если у меня файл находится в открытом состоянии в режиме чтения-записи и его размер велик (скажем 100 мб.) -- отнимает ли это соответствующий объем оперативной памяти?
Нет, не отнимает.
 
Цитата
Иван Ру написал:
Затем я его читаю в эксель.

А если писать напрямую в excel?
Сам не пробовал, но вроде можно так или так.
 
Цитата
Imersio Arrigo написал:
Цитата
Николай  Камынин   написал:
3) Если надо дописать, то ищем изменяемую запись , читаем ее, добавляем и пишем на свое место.
Ну так-то обычно все данные  после места записи обрезаются.
Нельзя просто так взять и вставить запись внутрь файла ;)

Отличным  решением был бы например маппинг файла в память, но, боюсь на луа это не доступно.
Цитата
Иван Ру   написал:
Если у меня файл находится в открытом состоянии в режиме чтения-записи и его размер велик (скажем 100 мб.) -- отнимает ли это соответствующий объем оперативной памяти?
Нет, не отнимает.
Если будете правильно писать то данные не будут обрезаться.
А вот память под файлы расходуется. т е "отнимает"
Более того, если Вы не делаете выгрузку, то данные будут в памяти а не на диске.
 
Цитата
Иван Ру написал:
Цитата
Николай  Камынин   написал:
Цитата
Иван Ру   написал:
Есть открытый текстовый файл, скажем, длинной в 100 строк.
Необходимо дописать данные, скажем, в 79 строку (номер известен). Возможно ли такое средствами Lua, есть ли у кого пример реализации подобной функции?
Вашу задачу  можно так:
1) Все записи делаем одинаковой длины, например 128 байт
2) Если запись короче 128 то добиваем ее либо пробелом либо нулями.
3) Если надо дописать, то ищем изменяемую запись , читаем ее, добавляем и пишем на свое место.
Возможно мы друг друга недопоняли. Записи я делаю в csv (текстовый) файл с разделителями в виде ";". Затем я его читаю в эксель. По-сути надо добавить дополнительные элементы данных в отдельные строки, де-факто они всегда оказываются ближе к концу файла.
Кстати, попутный вопрос. Если у меня файл находится в открытом состоянии в режиме чтения-записи и его размер велик (скажем 100 мб.) -- отнимает ли это соответствующий объем оперативной памяти? Если да - как этого избежать? Только закрытием файла и повторным открытием для записи?
память под файлы расходуется, но это не 100 мб и беспокоится не стоит.
Попробую объяснить про дозапись.
Есть два режима записи - бинарный и текстовый.
В текстовом инфа пишется в файл последовательно запись за записью . Каждая строка пишется в формате ASCIZ, т е признак конца строки - это ноль.
поэтому просто добавить в конец  какой- либо, не последней, строки в файле  невозможно, так как нет места для этого.
Поэтому я Вам предложил
сделать строки одинаковыми по длине - это ускорит поиск нужной строки
и создать место для дозаписи. Т е Вы создаете пустое место на диске и пишите в это место .
----------------------------
Если Вы пишите в файл лишь для передачи в Excel, то это можно делать через протокол Dynamic Data Exchange (DDE)  сразу в Excel.
Но это требует знаний в написании DLL на СИ для Lua.
Страницы: 1
Читают тему
Наверх