簡體   English   中英

Ruby - 檢查文件是否為CSV

[英]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>

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

使用File.extname()檢查源文件

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM