2015-07-19 84 views
0

我正在嘗試編寫一個CSV解析器。每一行都有多個需要處理的字段。每條線代表患者數據,所以我需要自己處理每條線。一旦我完成了每一行的處理,我需要進入下一個步驟,直到文件結束。Ruby解析循環中的CSV行

我已經成功地開始在Ruby中編寫解析器。數據正在被導入,它正在創建一個數組數組(每行都是一個數組)。

我遇到的問題是正確循環逐行掃描數據。所以,現在我可以成功處理第一行並解析每個字段。當我在新的患者數據中添加另一行時,我開始遇到問題。第二行被處理並添加到已創建的新數組中。例如,第1行和第2行曾經處理過,被添加到一個大數組而不是數組數組中。導入的數據需要以相同的結構輸出。

這是到目前爲止我的代碼:

original_data = Array.new 
converted_data = Array.new 

Dir.chdir 'convert' 
CSV.foreach('CAREPRODEMO.CSV') do |raw_file| 
    original_data << raw_file 
end 

# Needed at beginning of array for each patient 
converted_data.insert(0, 'Acvite', 'ACT') 

# Start processing fields 
original_data.each do |o| 

    # BEGIN Check for nil in original data and replace with empty string 
    o.map! { |x| x ? x : ''} 

    converted_data << o.slice(0) 

    # Remove leading zeros from account number 
    converted_data[2].slice!(0) 
    if converted_data[2].slice(1) == '0' 
    converted_data[2].slice!(1) 
    end 

    # Setup patient name to be processed 
    patient_name = Array.new 

    patient_name << o.slice(3..4) 
    converted_data << patient_name.join(' ') 

    # Setup patient address to be processed 
    patient_address = Array.new 

    patient_address << o.slice(5) 
    converted_data << patient_address.join(' ') 



    # END Check for nil in converted data and replace with empty string 
    converted_data.map! { |x| x ? x : ''} 

end 

# For debugging 
p converted_data 

輸出:

["Acvite", "ACT", "D65188596", "SILLS DALTON H", "16243 B L RD", "00D015188596", "BALLARD DAVE H", "243 H L RD", "", "", ""] 

通緝:

["Acvite", "ACT", "D65188596", "SILLS DALTON H", "16243 B L RD"] 
["Acvite", "ACT", "D15188596", "BALLARD DAVE H", "243 H L RD"] 

回答

1

你需要使用數組的數組用於存儲結果,您正在使用單個數組,因此您提到的輸出。

移動converted_data陣列內循環,並限定用於收集每個迴路的輸出的新數組。下面顯示了一種可能的方法。

original_data = Array.new 

# Changed the variable name from converted_data 
final_data = Array.new 
... 
original_data.each do |o| 
    converted_data = Array.new 
    ... 

    # END Check for nil in converted data and replace with empty string 
    converted_data.map! { |x| x ? x : ''} 

    final_data << converted_data 
end 

p final_data 
+0

謝謝。這工作正是我需要它。不得不修改代碼,以確保空數組沒有得到在末端插入一次行結束爲止。 – bradbajuz