首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除文件中的行- Ruby

删除文件中的行- Ruby
EN

Stack Overflow用户
提问于 2011-08-23 13:55:26
回答 3查看 4.7K关注 0票数 4

从ruby中的CSV文件中删除特定行中存在特定值的行的聪明方法是什么?

下面是一个文件的示例:

代码语言:javascript
复制
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

理想情况下,我希望创建一个仅包含以下内容的新文件:

代码语言:javascript
复制
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

当给定以下内容时:

代码语言:javascript
复制
300-2580
300-3080
300-2080

所以我知道我可以用sort filename|uniq -d做到这一点,但我正在努力学习Ruby (有点痛苦)。

提前谢谢你,M

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-23 15:08:00

您可以使用它来获取csv文件中数组中的唯一行

代码语言:javascript
复制
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"]

要将其写入新文件,您可以在写入模式下打开一个文件,将以下内容写入该文件:

代码语言:javascript
复制
File.open("new_csv", "w+") { |file| file.puts File.readlines("csv").uniq }

为了比较数值,您可以在",“上使用split函数来访问每一列,如下所示:

代码语言:javascript
复制
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

票数 12
EN

Stack Overflow用户

发布于 2011-08-23 14:11:53

嗯,我不认为这个例子能得到你想要的答案……但这是可行的..。

tmp.txt =>

代码语言:javascript
复制
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将返回以下内容:

代码语言:javascript
复制
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数组,我相信你可以学习如何根据与期望字符串的比较来选择你想要的条目。

票数 0
EN

Stack Overflow用户

发布于 2014-12-30 09:50:26

您还可以创建一个Hash,它不允许重复记录作为其条目。例如,下面的代码应该会有所帮助:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7156825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档