Может ли кто-нибудь помочь мне с помощью ipairs, чтобы изменить содержимое текстового файла? Я почти там, я думаю - PullRequest
0 голосов
/ 17 июня 2019

Я вовсе не опытный программист, и ответ на эту проблему, вероятно, покажет явное отсутствие понимания какого-либо критического компонента, но я пытаюсь открыть текстовый файл и сохранить каждую строку в таблице.Затем я хочу перебрать строки и выполнить некоторые манипуляции со строками, чтобы получить только критические части строки, которые мне нужны, и сохранить это значение в переменной.Затем у меня есть код для изменения значения переменной с помощью ползунка imgui, затем у меня есть кнопка, которая запускает некоторый код для записи новых значений обратно в текстовый файл.У меня проблема в том, что я перебираю файл с помощью ipairs, и он находит первый шаблон текста, а затем анализирует его так, как мне нужно, и сохраняет содержимое в предопределенном имени переменной.Как мне заставить его перейти к следующей строке и сохранить это значение в другом предопределенном имени переменной, даже если результаты манипуляции со строками имеют то же значение?Должен ли я использовать динамические переменные?Я понятия не имею, как это сделать.Проблема в том, что я буду запускать этот плагин на многих различных текстовых файлах с разным количеством строк и значений, причем некоторые значения будут идентичны.

Вот фрагмент текстового файла и его вид,Я пытаюсь предоставить ползунки для изменения номера после строк DEG_PER_ACTION.

Выбор топлива

BEGIN_MANIP command_knob laminar/c172/fuel_selector_up laminar/c172/fuel_selector_dwn
DEG_PER_ACTION 1

END_MANIP

BEGIN_MANIP command_knob laminar/c172/ignition_up laminar/c172/ignition_down
DEG_PER_ACTION 2

  HOLD_MANIP

END_MANIP


if knob_read_init == false then -- flag to do this one time, start the reading of the current vrconfig, save lines to table.

    local file = io.open(AIRCRAFT_PATH ..string.sub(AIRCRAFT_FILENAME, 0, -5).."_vrconfig.txt", "r+") -- any aircraft's vrconfig
    io.input(file) -- open the file
    knob_table = {} -- create a table called knob_table
    for line in file:lines() do -- insert each line into a table's position
        table.insert (knob_table, line)
    end

------Read and Register Knob Names based on Commands or Datarefs----



 for index, value in ipairs(knob_table) do -- here we start parsing to find the first instance of a command knob
      if string.sub(value, 1, 1) ~= '#' then -- if the line doesn't start with a #
        if string.match(value, "/") then -- if the line has a / in it, i.e. datarefs, commands
          if string.match(value, "BEGIN_MANIP command_knob") then -- if it's a command knob
          value = string.gsub(value, "BEGIN_MANIP command_knob", "") -- get rid of the first part of the line and save only the command/dataref to the value
          knobOne = value -- store that value in a variable called knobOne, this is now our knob's name.
          end
        end
      end
    end

for index, value in ipairs(knob_table) do
      if string.sub(value, 1, 1) ~= '#' then
        if string.match(value, "/") then
          if string.match(value, "BEGIN_MANIP command_knob") then
          value = string.gsub(value, "BEGIN_MANIP command_knob", "")
            if value ~= knobOne then -- the same iterator as above, but this line allows it to find the next one.
            knobTwo = value -- stores value in knobTwo
            end
          end
        end
      end
    end

    -------Read and Register Old knob sensitivity numbers (deg_per_action) and store them in a variable------

    for index, value in ipairs(knob_table) do
      if string.sub(value, 1, 1) ~= '#' then
        if string.match(value, "DEG_PER_ACTION") then
          value = string.gsub(value, "DEG_PER_ACTION", "") -- sub out the text, leaving only the number
          k1s = value -- store the number in a variable called k1s (stands for knob One Speed)
        end
      end
    end

    for index, value in ipairs(knob_table) do
      if string.sub(value, 1, 1) ~= '#' then
        if string.match(value, "DEG_PER_ACTION") then
          value = string.gsub(value, "DEG_PER_ACTION", "")
            if value ~= k1s then -- allows to go on to next deg_per_action line?  needs work.
            k2s = value
            end
        end
      end
    end




    io.close(file)

    knob_read_init = true -- boolean sets flag to true so that the above only happens once.  

-----then i write the lines back in, using a boolean flag hack to write them separately -----

if imgui.Button ('   Write File   ') then
  file = io.open(AIRCRAFT_PATH ..string.sub(AIRCRAFT_FILENAME, 0, -5).."_vrconfig.txt", 'w')


   k2sflag = 0
   for index, value in ipairs(knob_table) do

     if string.match(value, "DEG_PER_ACTION") and k2sflag == 0 then
       file:write ("DEG_PER_ACTION ", k2s..'\n')
       k2sflag = 1
      elseif string.match(value, "DEG_PER_ACTION") then
       file:write ("DEG_PER_ACTION ", k1s..'\n')
      else
        file:write(value..'\n')
      end

    end
    io.close(file)

Это работает для предопределенного текстового файла, но я хочу сделать это со многими различнымитекстовые файлы с разным количеством строк DEG_PER_ACTION, а также с разными значениями, включая много одинаковых значений, поэтому я не думаю, что строка «if value ~ = k1s» действительно не работает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...