[英]Ruby - checking if file is a 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|
等等......
我認為在沒有額外信息的情況下進行真正的安全測試是不可能的。
只是注意你可以做什么:你得到一個變量文件名的文件名。
首先,檢查它是否是文件:
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
你可以使用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>
使用File.extname()檢查源文件
File.extname("test.rb") #=> ".rb"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.