我刚刚编写了一个代码,我在参数中传递了一个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|
等等...
答案 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>
答案 2 :(得分:-1)
使用 File.extname() 检查原始文件
File.extname("test.rb") #=> ".rb"