我正在使用ruby和gem nokogiri将html转换为csv并且它工作得很好,但我也希望转换数据。
据我所知,ruby有一个我可以利用的转置函数,但我不知道如何将它集成到我正在使用的脚本中,因为我对ruby不是很好。
有人可以帮助我将转置代码放在此脚本中的正确位置以获得所需的效果吗?
require 'rubygems'
require 'nokogiri'
print_header_lines = ARGV[1]
File.open(ARGV[0]) do |f|
table_string=f
doc = Nokogiri::HTML(table_string)
doc.xpath('//table//tr').each do |row|
if print_header_lines
row.xpath('th').each do |cell|
print '"', cell.text.gsub("\n", ' ').gsub('"', '\"').gsub(/(\s){2,}/m, '\1'), "\", "
end
end
row.xpath('td').each do |cell|
print '"', cell.text.gsub("\n", ' ').gsub('"', '\"').gsub(/(\s){2,}/m, '\1'), "\", "
end
print "\n"
end
end
根据我在网上找到的信息,转置脚本看起来像这样:
require 'CSV'
rows = CSV.new($stdin).read
puts rows.transpose.map { |x| x.join ',' }
当然,需要需要在顶部,但我不确定在上面的例子中要改变什么才能使输出转换。
非常感谢提前。
答案 0 :(得分:2)
如果要使用转置,则需要2d数组。目前,您只需一次打印一行。使用地图:
tbl_array = doc.xpath('//table//tr').map do |row|
row.xpath('td').map do |cell|
"\" #{cell_text.gsub("\n", ' ').gsub('"', '\"').gsub(/(\s){2,}/m, '\1')} \", "
end
end
tbl_array.transpose.each do |row|
row.each { |cell| print cell }
end