2015-09-06 52 views
0

我有CSV文件如下閱讀文件和驗證行Ruby中

ID  Required -- these are headers 
SD0005 Yes  -- row information 

我要驗證針對報頭的每一行。說ID包含字母和數字,長度不應超過6個。 必需的標題在每行中應爲「是」或「否」。

如果我必須處理一個超過1000行且性能良好的大文件,那麼如何在Ruby中實現此功能?

我讀特定行鍼對每一個標題如下

CSV.foreach('file path', :headers => true) do |csv_obj| 
csv_obj['ID'] 
csv_obj['Required'] 

有沒有辦法知道而行驗證對標題列其狀態失敗。我需要知道它在哪種情況下失敗並打印出來

新來的紅寶石。欣賞幫助

+0

你需要紅寶石處理的記錄。爲什麼你會在JavaScript中有驗證碼? –

+0

編輯問題 –

回答

0

要從CSV文件中獲取數據到紅寶石,請嘗試以下操作:

# This will read the data in with headers, convert the column names to symbols, 
# and then turn each resulting CSV::Row instance into a hash 

data = CSV.read('temp.csv', headers: true, header_converters: :symbol).map(&:to_h) 

這應該返回以下內容:

=> [{:id=>"SD0005", :required=>" yes"}, ...] 

一旦你有你所有的信息在格式,你可以在Ruby中使用,你可以創建一個方法來檢查每個ID的有效性。

def valid_id?(id_string) 
    # uses Regular Expressions to ensure ID is 6 
    # characters that consist of only numbers/letters 
    # The double-bang(!!) turn a truthy value to `true` 
    # or false value to `false` 

    !!id_string.match(/^[\D|\d]{6}$/) 
end 

如果您想測試另一列的有效性,請使用單獨的方法進行測試。

def valid_required?(req_column) 
    req_column.downcase == 'yes' || req_column.downcase == 'no' 
end 

創建主驗證方法

def all_valid?(row) 
    valid_id?(row[:id]) && valid_required?(row[:required]) 
end 

然後只保留一個ID爲有效

# #select keeps values whose block evaluates to `true` 
valid_records = data.select { |record| all_valid?(record) } 
+0

我在應用程序文件夾下的javascripts文件夾中有函數(當我們創建rails項目時創建了目錄結構)對於上面的哈希創建瞭如何爲給定行的每個列調用函數?假設我必須爲id調用valid_id,爲required調用valid_required等。header中的每列都有一個函數。然後只有在驗證通過所有行到數據庫列時才存儲完整的行信息。你能更具體地告訴我們如何在Ruby中編寫代碼嗎? –

+0

您可以創建另一種方法來檢查記錄「必需」必需屬性的有效性,例如'valid_required?',然後創建一個方法來檢查所有的驗證。例如:在'def all_columns_valid'裏面寫'valid_id? && valid_required?'。 –

+0

我鼓勵您對CSV Ruby文檔進行一些探索。它應該有助於給你理解,這對調試這些事情很有幫助。如果一切都失敗了,請看這裏http://stackoverflow.com/questions/4822422/output-array-to-csv-in-ruby –