Ruby - 检查文件是否为CSV

时间:2015-10-17 09:45:12

标签: ruby-on-rails ruby csv

我刚刚编写了一个代码,我在参数中传递了一个csv文件并逐行处理;到目前为止,一切都还好。现在,我想通过确保我们在参数中收到的内容是.csv文件来保护我的代码。

我在Ruby文档中看到它存在一个==“ - file”选项,但使用它会产生错误:我理解它的方式,似乎此选项仅适用于txt文件。

是否有特定方法允许检查我的文件是否为csv?这是我的一些代码:

    if ARGV.empty?
       puts "j'ai rien reçu"
    # option to check, don't work 
    elsif ARGV[0].shift == "--file"

    # my code so far, whithout checking  
    else  CSV.foreach(ARGV.shift) do |row|

等等...

3 个答案:

答案 0 :(得分:3)

我认为在没有其他信息的情况下进行真正的安全测试是不可能的。

请注意您可以做的事情: 你得到一个变量文件名的文件名。

首先,检查它是否是文件:

File.exist?

然后您可以检查编码是否正确:

raise "Wrong encoding" unless content.valid_encoding?

你的csv总是有相同数量的列吗?你只有一个班轮吗? 这可以进行下一次检查:

content.each_line{|line|
  return false if line.count(sep) < columns - 1
}

可以针对您的情况修改此检查,例如如果你总是有一个确切的行数。

总之,您可以定义类似的内容:

require 'csv'
#columns defines the expected numer of columns per line
def csv?(filename, sep: ';', columns: 3)
  return false unless File.exist?(filename) #"No file" 
  content = File.read(filename, :encoding => 'utf-8')
  return false unless content.valid_encoding? #"Wrong encoding" 

  content.each_line{|line|
    return false if line.count(sep) < columns - 1
  }
  CSV.parse(content, :col_sep => sep)

end

if csv = csv?('test.csv')
  csv.each do |row|
    p row
  end
end

答案 1 :(得分:1)

您可以使用ruby-filemagic gem

gem install ruby-filemagic

用法:

$ irb 
irb(main):001:0> require 'filemagic' 
=> true
irb(main):002:0> fm = FileMagic.new
=> #<FileMagic:0x7fd4afb0>
irb(main):003:0> fm.file('foo.zip') 
=> "Zip archive data, at least v2.0 to extract"
irb(main):004:0>

https://github.com/ricardochimal/ruby-filemagic

答案 2 :(得分:-1)

使用 File.extname() 检查原始文件

File.extname("test.rb")         #=> ".rb"