Ruby on rails JSON到CSV,跳过某些列并对其他列重新排序-Ruby

Ruby on rails JSON到CSV,跳过某些列并对其他列重新排序-Ruby,ruby-on-rails,json,ruby,csv,converters,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}" unle

我有一个工作脚本,可以很好地将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
如何将此脚本编辑为:

  • 删除带有某些标题的列,例如“score”和“original_name”
  • (将其余列按字母顺序从左到右重新排序)-如果可能

到目前为止,我所尝试的一切都完全破坏了脚本-从哪里开始进行这些更改是最好的

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
需要“csv”
需要“json”
需要“设置”
def get_递归_键(散列,嵌套_键=nil)
散列。每个带有_对象([])do |(k,v)的_,键|
#Col滤波器
下一步如果[“分数”,“原始名称]。包括?K
k=“#{nested_key}.#{k}”除非nested_key.nil?
如果v.u是a?搞砸
concat(获取递归键(v,k))
其他的

键过滤json键以删除某些列。并使用排序数组来保持输出的有序性。你试过什么?@knh190我一直在处理标题,但我的过滤器似乎每次都会破坏数组。我已经尝试使用“h”的switch语句过滤掉“headings.map do | h |”之后我不想要的列-在标题之前关注json键会更好吗?这太棒了!很好地工作,我也调整了它,现在只包括指定的头,而不是删除特定的头。
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