删除文件中的行 – Ruby
在特定行中存在特定值的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
您可以使用它来获取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 }
为了比较值,您可以在“,”上使用拆分function来访问每列,如下所示:
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"
如果您想要更多function,最好安装FasterCSV gem 。
好吧,我不认为这个例子会得到你想要的答案……但是这样可行……
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-3080
File.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数组,我相信你可以学习如何根据与所需字符串的比较来选择条目。
您还可以创建一个不允许重复记录作为其条目的哈希。 例如,以下代码应该有所帮助:
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 end