JSON转换为CSV,跳过某些列,并对其他列重新排序-Ruby

时间:2019-04-08 02:10:34

标签: ruby-on-rails json ruby csv converters

我有一个可以正常工作的脚本,可以很好地将JSON文件转换为CSV文件,但是我正在尝试编辑脚本以对CSV文件进行一些更改,然后再保存,目前没有成功。

这是我当前的转换脚本:

require 'csv'
require 'json'
require 'set'

def get_recursive_keys(hash, nested_key=nil)
  hash.each_with_object([]) do |(k,v),keys|
    k = "#{nested_key}.#{k}" unless nested_key.nil?
      if v.is_a? Hash
      keys.concat(get_recursive_keys(v, k))
    else
      keys << k
    end
  end
end

json = JSON.parse(File.open(ARGV[0]).read)
headings = Set.new
json.each do |hash|
  headings.merge(get_recursive_keys(hash))
end

headings = headings.to_a
CSV.open(ARGV[0] + '.csv', 'w') do |csv|
  csv << headings
  json.each do |hash|
    row = headings.map do |h|
      v = hash.dig(*h.split('.'))
      v.is_a?(Array) ? v.join(',') : v
    end
    csv << row
  end
end

我使用以下命令运行

for file in directory/*; do ruby json-to-csv.rb "$file"; done

我如何将该脚本编辑为:

  • 删除具有某些标题的列,例如“得分”和“原始名称”
  • (将其余各列从左到右按字母顺序重新排序)-如有可能?

到目前为止,我尝试过的所有操作都完全破坏了脚本-在哪里进行这些更改的最佳位置是什么?

1 个答案:

答案 0 :(得分:1)

这是有效的代码:

require 'csv'
require 'json'
require 'set'

def get_recursive_keys(hash, nested_key=nil)
  hash.each_with_object([]) do |(k,v),keys|
    # Col filter
    next if ["score", "original_name"].include? k
    k = "#{nested_key}.#{k}" unless nested_key.nil?
    if v.is_a? Hash
      keys.concat(get_recursive_keys(v, k))
    else
      keys << k
    end
  end
end

json = JSON.parse(File.open(ARGV[0]).read)
headings = Set.new
headings = get_recursive_keys(json)

headings = headings.to_a
# Header sorting
headings = headings.sort { |a, b| a <=> b }


CSV.open(ARGV[0] + '.csv', 'w') do |csv|
  csv << headings
  row = headings.map do |h|
    v = (h.split('.').length > 1) ? json.dig(*h.split('.')) : h
    v.is_a?(Array) ? v.join(',') : v
  end
  csv << row
end

我用这个小的json字符串进行了测试:{“ score”:“ 12”,“ name”:“ Obi”,“ original_name”:“ Wan Kenobi”,“ something”:{“ sub_key”:“ Wuhu”} }