Как считать файл INI в рубине

Вы можете добавить индекс для ключей из тех же массивов и вернуть новый объект для каждого вложенного массива.

function getFlat(array) {
    return array.reduce((r, o, i) => {
        Object
            .entries(o)
            .forEach(([k, v]) => Object.assign(r, Array.isArray(v)
                ? getFlat(v)
                : { [[k, i].join('_')]: v }
            ));
        return r;
    }, {});
}

var data = [{ dimensionId: 1, dimensionName: "dimensionName1", components: [{ componentId: 2, componentName: "componentName2", indicators: [{ indicatorId: 3, indicatorName: "indicatorName3" }, { indicatorId: 4, indicatorName: "indicatorName4" }] }, { componentId: 5, componentName: "componentName5", indicators: [{ indicatorId: 6, indicatorName: "indicatorName6" }, { indicatorId: 7, indicatorName: "indicatorName8" }] }] }];

console.log(getFlat(data));
.as-console-wrapper { max-height: 100% !important; top: 0; }

7
задан Andrew Redd 3 March 2009 в 18:55
поделиться

4 ответа

Я недавно использовал рубин-inifile. Возможно, это - излишество по сравнению с простыми отрывками здесь...

12
ответ дан 6 December 2019 в 07:52
поделиться

Если я понимаю правильно,

outFile = File.new('out.ini', 'w')
File.open('in.ini', 'r') do |inFile|
  inFile.each_line do |line|
    # foo is the entry you want to change, baz is its new value.
    outFile.puts(line.sub(/foo=(.*)/, 'foo=baz'))
  end
end
outFile.close

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

0
ответ дан 6 December 2019 в 07:52
поделиться
file = File.new("your.ini", "r")
  while (line = file.gets)
   puts "#{line}" #additionally make changes
  end
file.close
-4
ответ дан 6 December 2019 в 07:52
поделиться

Вот модуль для чтения и записи .ini-файлов с минимально возможным изменением исходного файла (для файлов, которые читают люди и машины):

 class IniFileExc 

класс IniNode def инициализировать (имя, значение = ноль) @line_start = -1; @line_end = -1; @level = 0; @name = имя; @value = значение; @keys = {}; @keylist = []; @modified = false; @deleted = ложь; конец attr_reader: level,: line_start,: line_end,: name,: value,: keylist,: keys,: modified,: deleted attr_writer: level,: line_start,: line_end,: name,: value,: keylist,: keys,: modified,: deleted

def to_str return @ name.to_s + '=' + @ value.to_s; конец

def to_s return @ value.to_s; конец def to_i return @ value.to_i конец def to_f return @ value.to_f; конец

def вставить (ключ, ноль); return @keys [ключ]; конец

def insert (ключ, значение) вернуть false if (@ keys.has_key? (key)); узел = ноль; if (значение && ((value.class == IniNode) || (value.class == IniSection))) узел = значение; еще если (@level <= 0) node = IniSection.new (ключ); еще node = IniNode.new (ключ, значение) конец конец node.line_start = @line_end + 1 если (node.line_start <0); node.level = @level + 1; @keys [ключ] = узел; @ keylist.push (ключ); вернуть истину; end

def [] = (ключ, значение) rc = insert (ключ, значение); @keys [ключ] .value = значение; @keys [ключ] .modified = true; @modified = true; конец

def delete (ключ) вернуть false if (! @ keys.has_key? (key)); @keys [ключ] .deleted = true; @modified = true; конец конец

класс IniSection

def to_str return ('[' + @name + ']'); конец конец

 класс IniFile 

def reload начать input = File.new (@name, "r"); спасение поднять; еще prevnode = node = self; бельеo = 0; input.each do | line | @ lines.push (строка); parsed_node = parse_line (белье, строка); если (parsed_node); если (parsed_node.class == IniSection) если (parsed_node! = узел) prev_node = узел; узел = parsed_node; вставить (имя узла, узел); prev_node.line_end = белье - 1; конец еще node.insert (parsed_node.name, parsed_node); конец конец белье + = 1; конец input.close;

  node.line_end = @line_end = lineno - 1;
end

end

def parse_line (белье, строка) вернуть ноль if (line = ~ / ^ \ s * $ /); вернуть ноль if (line = ~ / ^ \ s * # /); вернуть ноль if (line = ~ / ^ \ s *; /); если (строка = ~ /^\s*[\s*(.+)\s**********************************************) rv = IniSection.new ($ 1); rv.line_start = белье; rv.level = @level + 1; return rv; elsif (line = ~ /^\s(\S?.[1127164 impression[^=\s ])\s=\s*(\S?[^#;[^ #; \ s \ n]). $ /) rv = IniNode.new ($ 1, $ 2); rv.line_start = rv.line_end = белье; rv.level = @level + 2; return rv; конец вернуть ноль; конец

def запись вставлено = {}; @ keylist.each do | sect | sectnode = @keys [секта]; следующий if (! sectnode.modified || sectnode.deleted); если (sectnode.line_end <0) @ lines.push ("\ п"); @lines.push (sectnode.to_str + "\ n"); конец sectnode.keylist.each do | key | keynode = sectnode.keys [ключ]; следующий if (! keynode.modified || keynode.deleted); если (keynode.line_end <0) если (sectnode.line_end <0) @ lines.push (keynode.to_str + "\ n"); еще idx = sectnode.line_end.to_i; вставлено [idx] = [] если (! Insert.has_key? (idx)); вставлен [idx] .push (keynode.to_str); конец еще line = @lines [keynode.line_start]; if (line = ~ / ^ (\ s *) (\ S?. [^ = \ s] \ s = \ s * \ S?. + [^ #; \ s]) (\ s * [#;]. ) $ /) строка = $ 1 + keynode.to_str + $ 3 + "\ n"; еще line = line.gsub (/ ^ (\ s ) (\ S?. [^ = \ s] \ s = \ s * \ S? [^ #;] + [^ # ; \ n \ s]) (. *) $ /) { $ 1 + keynode.to_str + $ 3}; конец @lines [keynode.line_start] = строка; конец конец конец

  удалено = {};
 @ keylist.each do | sect |
 sectnode = @keys [секта];
 следующий, если (! sectnode.deleted &&! sectnode.modified);
 if (sectnode.deleted && (sectnode.line_start> = 0) && (sectnode.line_end> = 0) \
 && (sectnode.line_end> = sectnode.line_start))
 для i в sectnode.line_start..sectnode.line_end
 удалено [я] = истина;
 конец
 конец
 sectnode.keylist.each do | key |
 keynode = sectnode.keys [ключ];
 следующий, если (! keynode.deleted);
 удалено [keynode.line_start.to_i] = true \
 если ((keynode.line_start> = 0) && (keynode.line_end> = 0) && (keynode.line_start == keynode.line_end));
 конец
 конец 

begin
  file = File.new(@name, 'w');
rescue
  raise(IniFileExc, "Failed to open " + @name + " for writing: #{$!}", caller);
else
  cnt = -1;
  @lines.each do |line|
    cnt += 1;
    if (inserted.has_key?(cnt))
      inserted[cnt].each do |ins|
        file.puts(ins + "\n");
      end
    end
    next  if (deleted[cnt]);
    file.puts(line);
  end
  file.close;
end

конец конец

Пример использования:


begin
  ini = IniFile.new('file.ini');
  ini['common']['param'] = 'value';
  ini['common'].delete('unused_param');
  ini.delete('unused_section');
  print "Valuable value: ", ini['common']['param'], "\n";
  ini.write;
rescue IniFileExc
  print "Oh, that's not good: ", $!, "\n";
end

Надеюсь, это поможет.

2
ответ дан 6 December 2019 в 07:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: