从ruby中的CSV文件中删除特定行中存在特定值的行的聪明方法是什么?
下面是一个文件的示例:
350 lbs., Outrigger Footprint, 61" x 53", Weight, 767 lbs., 300-2080
350 lbs., Outrigger Footprint, 61" x 53", Weight, 817 lbs., 300-2580
350 lbs., Outrigger Footprint, 61" x 53", Weight, 817 lbs., 300-2580
350 lbs., Outrigger Footprint, 69" x 61", Weight, 867 lbs., 300-3080
350 lbs., Outrigger Footprint, 69" x 61", Weight, 867 lbs., 300-3080理想情况下,我希望创建一个仅包含以下内容的新文件:
350 lbs., Outrigger Footprint, 61" x 53", Weight, 767 lbs., 300-2080
350 lbs., Outrigger Footprint, 61" x 53", Weight, 817 lbs., 300-2580
350 lbs., Outrigger Footprint, 69" x 61", Weight, 867 lbs., 300-3080当给定以下内容时:
300-2580
300-3080
300-2080所以我知道我可以用sort filename|uniq -d做到这一点,但我正在努力学习Ruby (有点痛苦)。
提前谢谢你,M
发布于 2011-08-23 15:08:00
您可以使用它来获取csv文件中数组中的唯一行
File.readlines("file.csv").uniq
=> ["350 lbs., Outrigger Footprint, 61\" x 53\", Weight, 767 lbs., 300-2080\n", "350 lbs., Outrigger Footprint, 61\" x 53\", Weight, 817 lbs., 300-2580\n", "350 lbs., Outrigger Footprint, 69\" x 61\", Weight, 867 lbs., 300-3080\n"]要将其写入新文件,您可以在写入模式下打开一个文件,将以下内容写入该文件:
File.open("new_csv", "w+") { |file| file.puts File.readlines("csv").uniq }为了比较数值,您可以在",“上使用split函数来访问每一列,如下所示:
rows = File.readlines("csv").map(&:chomp) # equivalent to File.readlines.map { |f| f.chomp }
mapped_columns = rows.map { |r| r.split(",").map(&:strip) }
=> [["350 lbs.", " Outrigger Footprint", " 61\" x 53\"", " Weight", " 767 lbs.", " 300-2080"], ["350 lbs.", " Outrigger Footprint", " 61\" x 53\"", " Weight", " 817 lbs.", " 300-2580"], .....]
mapped_columns[0][5]
=> "300-2080"如果你想要更多的功能,你最好安装FasterCSV gem。
发布于 2011-08-23 14:11:53
嗯,我不认为这个例子能得到你想要的答案……但这是可行的..。
tmp.txt =>
350 lbs., Outrigger Footprint, 61" x 53", Weight, 767 lbs., 300-2080
350 lbs., Outrigger Footprint, 61" x 53", Weight, 817 lbs., 300-2580
350 lbs., Outrigger Footprint, 61" x 53", Weight, 817 lbs., 300-2580
350 lbs., Outrigger Footprint, 69" x 61", Weight, 867 lbs., 300-3080
350 lbs., Outrigger Footprint, 69" x 61", Weight, 867 lbs., 300-3080File.readlines('tmp.txt').uniq将返回以下内容:
350 lbs., Outrigger Footprint, 61" x 53", Weight, 767 lbs., 300-2080
350 lbs., Outrigger Footprint, 61" x 53", Weight, 817 lbs., 300-2580
350 lbs., Outrigger Footprint, 69" x 61", Weight, 867 lbs., 300-3080因此,您还可以轻松地使用Array fxns进行排序。谷歌ruby数组,我相信你可以学习如何根据与期望字符串的比较来选择你想要的条目。
发布于 2014-12-30 09:50:26
您还可以创建一个Hash,它不允许重复记录作为其条目。例如,下面的代码应该会有所帮助:
require 'optparse'
require 'csv'
require 'pp'
options = Hash.new
OptionParser.new do |opts|
opts.banner = "Usage: remove_extras.rb [options] file1 ..."
options[:input_file] = ''
opts.on('-i', '--input_file FILENAME', 'File to have extra rows removed') do |file|
options[:input_file] = file
end
end.parse!
if File.exists?(options[:input_file])
p "Parsing: #{options[:input_file]}"
UniqFile=Hash.new
File.open(options[:input_file]).each do |row|
UniqFile.store(row,row.hash)
end
puts "please enter the output filename: \n"
aFile=File.open(gets.chomp, "a+")
UniqFile.each do|key,value|
aFile.syswrite("#{key}")
end
endhttps://stackoverflow.com/questions/7156825
复制相似问题