ruby - 如何在 CSV 文件中生成列而不是行
问题描述
所以我要做的是从现有的 CSV 文件中读取特定列,从提取的数据中解析一些信息,然后在单个列中使用新解析的信息创建一个新的 CSV 文件。生成的数组的标题和第一个条目正确地进入 CSV 文件,但之后,所有其他条目都进入同一行的相邻单元格,而不是创建一列,所以它就像一个 L 形而不仅仅是一条线。有任何想法吗?
#!ruby.exe
require 'csv'
puts "Please enter a file name:" #user input file name (must be in same
folder as this file)
file = gets.chomp
begin
File.open(file, 'r')
rescue
print "Failed to open #{file}\n"
exit
end #makes sure that the file exists, if it does not it posts an error
data_file = File.new(file)
data = [] #initializes array for addresses from .csv
counter=0 #set counter up to allow for different sized files to be used
without issue
CSV.foreach(data_file, headers: true) do |row|
data << row.to_hash
counter+=1
end #goes through .csv one line ar a time
data.reject(&:empty?)
puts "Which column do you want to parse?"
column = gets.chomp
i=0
streets = []
while (i<counter)
address = data[i][column]
street_name = address.gsub(/^((\d[a-zA-Z])|[^a-zA-Z])*/, '')
streets.push(street_name)
i+=1
end
streets.reject(&:empty?)
puts "What do you want the output to be called?"
new_file = gets.chomp
CSV.open(new_file, "w", :write_headers=> true, :headers => [column]) do |hdr|
hdr << streets
end
解决方案
您应该扫描街道数组并将其作为一行插入,这意味着您需要将数据行放入数组中,然后才能发送到 csv。好的,也许代码比解释更简单:
CSV.open(new_file, "w", :write_headers=> true, :headers => [column]) do |csv_line|
streets.each { |street| csv_line << [street] }
end
推荐阅读
- python - 正则表达式:找到字符的第一次出现时停止
- javascript - formatCreateLabel 在某些情况下不显示“创建新标签...” react-slect/creatable
- c++ - 使用 libssh SFTP 下载的文件已损坏
- flutter - Flutter_Translate:方法调用不是常量表达式
- javascript - 在 TypeScript 中出现错误:类型 'string[]' 不可分配给类型 'string'.ts(2345)
- sql - 总和 >90 天除以总天数
- javascript - 这是 3D 图形吗?还有更多信息吗?
- javascript - 更改three.js CylinderGeometry 顶部(或底部)半径问题
- nginx - Q: 如何用 ingress-nginx 重写多条路径中的单条路径
- java - 二进制类的 Swagger 注释?