LUA: Как извлечь определенные значения из файла xls или csv и сохранить их как переменные?
Я новичок в Луа (в лучшем случае).
У меня есть сценарий *.lua, который в какой-то момент имеет функцию, которая при вызове устанавливает набор переменных. (или обновляет их) Эти конкретные переменные должны быть извлечены из файла xls или csv - то, чем может управлять Excel.
Так что в Excel у меня есть строки и столбцы, как это:
valuefield_1 100 20 30
valuefield_2 60 150 40
valuefield_3 80 90 170
и т.п.
Я хочу иметь возможность искать определенное поле значений через lua в xls/csv, например, "valuefield_1", и получить значение в третьем третьем столбце, которое будет равно 20. Затем оно сохраняется как переменная x в моем скрипте lua, так что что всякий раз, когда я вызываю переменную x, она использует значение 20 до тех пор, пока я не обновлю переменную x с другим значением путем поиска другого значения поля значений.
В моих попытках найти решение этой (казалось бы, простой) проблемы все, с чем я столкнулся, это модули xls для lua, как выводить файлы, как создавать графики, сложные вещи, намного превосходящие то, что я хочу сделать.
Разве нет простого способа, которым я мог бы иметь строку, где она определяет мою переменную, говоря:
variable_x = значение ячейки в третьем столбце строки valuefield_x
так что я могу просто установить valuefield_x в моем luascript в соответствии с тем, какое поле значений я ищу?
Это действительно все, что мне нужно, мне не нужно писать файлы xls / csv или что-либо менять в них. Все, что я хочу, - это точное чтение определенных ячеек в определенных столбцах, которые выбираются по тому "полю значений", которое я ищу в первом столбце.
Может кто-нибудь сказать мне, что команды для этого?
2 ответа
Спасибо за ответ, Schollii. Проблема заключалась в том, что я даже не знал, как начать с доступа, открытия, редактирования или иного использования Excel через lua, поэтому любой пример кода был в значительной степени бесполезен. Поэтому я подумал, что лучше всего описать то, что мне нужно, а не неправильно перенаправлять фрагменты кода, которые касаются совершенно разных вещей. (например, io.open и другие)
Как всегда, после многого - НАМНОГО - исследования и просмотра 3 различных руководств и перечитывания того, кто знает, сколько неуместных ответов, я нашел ответ, который работает для меня. Это на самом деле очень просто, так что я не могу представить, сколько людей могли бы уделить мне часы и часы исследования с пятиминутным ответом. Будем надеяться, что, предоставив очень подробный ответ, я смогу гарантировать, что другие новички, такие как я, которые хотят сделать то же самое, не должны проводить такое же количество исследований. И да, ответ очень простой, и да, я также объясняю вещи, которые не нужно объяснять большинству людей, знающих код lua. Это для начинающих, как я.
Сначала: загрузите "Lua для Windows" http://code.google.com/p/luaforwindows/
Lua не может - сам по себе - обрабатывать формат Excel, поэтому вместо этого вам нужно использовать плагин LUACOM, который является одним из модулей, установленных через "Lua для Windows". Он также включает в себя отличный редактор скриптов, который вы можете щелкнуть правой кнопкой мыши по файлу скриптов, щелкните отредактируйте скрипт, и у вас есть хороший интерфейс для редактирования и тестирования вашего скрипта.
Фактический скрипт:
Первая часть вашего скрипта требует, чтобы вы использовали Excel через luacom.
require('luacom')
excel = luacom.CreateObject("Excel.Application")
excel.Visible = true
a. Строка "require" сообщает lua, что для использования скрипта lua требуется модуль "luacom".
б. Вторая строка через luacom открывает экземпляр Excel, который в сценарии называется "excel". Это необходимо, чтобы иметь возможность целиться с помощью команд.
с. excel.Visible определяет, может ли пользователь видеть открытый экземпляр excel или использовать его невидимым. Обратите внимание, как "Excel". контрольные точки в экземпляре, который мы назвали "Excel" в строке 2.
(Альтернатива) Также возможно нацелить на существующий экземпляр Excel, который уже был открыт пользователем вручную, заменив вторую строку:
excel = luacom.GetObject("Excel.Application")
Если мы используем альтернативный способ и нацеливаемся на уже открытую программу Excel, мы уже можем нацелить все значения на первом листе. Однако если мы создаем новый экземпляр Excel, нам нужно открыть файл, из которого мы хотим прочитать.
fpath = "C:\\Examplepath\\Example.xlsx"
wb = excel.Workbooks:Open(fpath)
ws = wb.Worksheets("ImportantSheet1")
а. В первой строке этой части fpath определяет местоположение файла xlsx, к которому мы хотим получить доступ. Обратите внимание, что вместо "\" используется "\".
б. Мы создаем ссылку "wb", аналогичную ссылке "excel" в нашей первой части кода. Однако она открывает файл Workbook (файл Excel) в месте (fapth). Опять же, обратите внимание, как "excel" указывает код в экземпляре Excel, который мы создали ранее.
с. Эта строка определяет, какой лист нужно открыть в только что открытом файле рабочей книги. В данном случае это лист с именем "ImportantSheet1".
desired_name = "whatIseek"
for row=1, 4 do
for col=1, 4 do
local cell_location = excel.Cells(row, col).Value2
if cell_location == desired_name then
Value1 = excel.Cells(row, col +1).Value2
Value2 = excel.Cells(row, col +2).Value2
Value3 = excel.Cells(row, col +3).Value2
end
end
end
print(Value1)
print(Value2)
print(Value3)
а. required_name устанавливает значение, которое мы ищем (в данном случае строка)
б. Строки 2 и 3 определяют, что следующий процесс должен быть выполнен для строк 1-4 и столбцов 1-4, хотя вам не нужно вызывать эти строки или столбцы.
с. Следующая строка устанавливает значение переменной "текущая ячейка" равным значению ячейки в Excel в позиции (x, y). Вам нужно использовать ".Value2" (не ".Value") для этой команды. Так что теперь наша временная переменная имеет значение ячейки.
д. В команде "if" мы проверяем, равно ли текущее значение ячейки значению, которое мы указали ранее как "требуемое_имя", которое мы ищем.
е. Если это так, "затем" следующие 3 строки устанавливают значения 1-3 для ячеек в следующих столбцах в той же строке. (Таким образом, он "читает" слева направо следующие значения и сохраняет их как нашу переменную)
е. Наконец, чтобы проверить, действительно ли у нас есть нужные значения, мы используем команду print, чтобы просмотреть их при выполнении скрипта. (Это, конечно, не обязательно для работы с этими значениями, это просто здесь, чтобы проверить, работает ли этот скрипт)
Я не знаю о считывателе файлов.xls в Lua, и сомневаюсь, что написать его на чистом Lua можно (хотя посмотрите на модуль xlrd в Python, его легко конвертировать в Lua). В Python вы можете сделать это легко с модулем win32com, поэтому, если у вас есть возможность использовать Python, его очень легко изучить.
Для файла.CSV вы должны использовать открыть и прочитать, как любой другой текстовый файл, а затем проанализировать с сопоставлением с шаблоном Lua. Если вы опубликуете что-то, где вы покажете, что вы пробовали (возможно, именно поэтому вы получили так много отрицательных голосов), я могу опубликовать более конкретный ответ.