当前位置: 首页 > 知识库问答 >
问题:

如何使用ruby将一个csv映射到另一个csv

邢英奕
2023-03-14

我有两个不同标题的csv。

假设CSV1有一、二、三、四个标题,我想创建一个有五、六、七、八个标题的csv。

我很难编写代码来打开第一个CSV,然后创建第二个CSV。

这是我目前掌握的代码。

require 'csv'

wmj_headers = [
  "Project Number", 
  "Task ID",    
  "Task Name",
  "Status Comment", 
  "Act Complete", 
  "Plan Complete", 
  "Description"]

jir_headers_hash = {
  "Summary" => "Task Name",
  "Issue key" => "Status Comment",
  "Resolved" => "Act Complete",
  "Due date" => "Plan Complete",
  "Description" => "Description"
}
puts "Enter path to a directory of .csv files"
dir_path = gets.chomp
csv_file_names = Dir["#{dir_path}*.csv"]

csv_file_names.each do |f_path|
  base_name = File.basename(f_path, '.csv')
  wmj_name = "#{base_name}_wmj.csv"

  arr = []
  mycount = 0
  CSV.open(wmj_name, "wb") do |row| 
    row << wmj_headers 


    CSV.foreach(f_path, :headers => true) do |r|
      r.headers.each do |value|
        if jir_headers_hash[value].nil? == false
          arr << r[value]
        end
      end
    end 
    row << arr
  end
end

共有2个答案

郝峰
2023-03-14

如果您想替换CSV列名,如下所示:

require 'csv'

# [["one", "two", "three"], ["1", "2", "3"], ["4", "5", "6"]]
csv = CSV.read('data.csv')

# new keys
ks = ['k1', 'k2', 'k3']

# [["k1", "k2", "k3"], ["1", "2", "3"], ["4", "5", "6"]]
k = csv.transpose.each_with_index.map do |x,i|
  x[0] = ks[i]
  x
end.transpose

# write new file
CSV.open("myfile.csv", "w") do |csv|
  k.each do |row|
    csv << row
  end
end
申屠裕
2023-03-14

人们往往把事情搞得过于复杂。您根本不需要任何CSV处理来替换标题。

$ cat /tmp/src.csv
one,two,three
1,2,3
4,5,6

让我们替换标题并原封不动地流式传输其他所有内容。

subst = {"one" => "ONE", "two" => "TWO", "three" => "THREE"}
src, dest = %w[/tmp/src.csv /tmp/dest.csv].map { |f| File.new f, "a+" }
headers = src.readline() # read just headers
dest.write(headers.gsub(/\b(#{Regexp.union(subst.keys)})\b/, )) # write headers
IO.copy_stream(src, dest, -1, headers.length) # stream the rest
[src, dest].each(&:close)

检查它:

$ cat /tmp/dest.csv
ONE,TWO,THREE
1,2,3
4,5,6
 类似资料:
  • 我需要将Java转换为的实例(包括映射内容) 我应该用什么来代替来使此代码可编译?

  • 问题内容: 我正在寻找有关如何在Python中将一个范围值转换为另一范围值的想法。我正在从事硬件项目,正在从可返回一定范围值的传感器读取数据,然后使用该数据来驱动需要不同范围值的执行器。 例如,假设传感器返回的值在1到512的范围内,并且执行器由5到10的值驱动。我想要一个函数,我可以传递一个值和两个范围并取回该值映射到第二个范围。如果这样的函数被命名,则可以这样使用: 在此示例中,我希望输出为,

  • 问题内容: [‘a’,’a’,’b’,’c’,’c’,’c’] 至 和 问题答案: x=[‘a’,’a’,’b’,’c’,’c’,’c’] >>> map(x.count,x) [2, 2, 1, 3, 3, 3] >>> dict(zip(x,map(x.count,x))) {‘a’: 2, ‘c’: 3, ‘b’: 1} >>>

  • 我正在用Stream学习Java,我有一张

  • 我刚刚开始看Java8,为了尝试lambdas,我想我应该尝试重写我最近写的一个非常简单的东西。我需要将一个字符串到列的映射转换为另一个字符串到列的映射,其中新映射中的列是第一个映射中列的防御副本。列具有复制构造函数。到目前为止我得到的最接近的数据是: 但我相信一定有更好的方法来做这件事,我会很感激一些建议。

  • 但是当我运行应用程序时,我会得到以下异常: