我寫了一個簡單的程序,解析我的銀行交易CSV文件。我的表達式將結果推送到將被保存到數據庫的數組/散列數據結構。如何在Ruby中使用matchdata對象編寫條件邏輯?
有兩個部分:
- 打開文件,讀出每一行,並推動它一個運行方法。
- 從哈希中提取數據的視圖。
我已經在下面列出了我的主要分析方法。它檢查每一行的關鍵字,如果匹配失敗,它應該推送到未分類的哈希。但是,有條件的要麼是根據我使用的是elsif
還是else
來推動ALL或NO交易。
Matchdata對象默認返回字符串,所以else
應該工作不應該嗎?這是構建數據結構的方法。我評論過我遇到的問題:
def generateHashDataStructure(fileToParse, wordListToCheckAgainst)
transactionInfo = Hash.new
transactionInfo[:transactions] = Hash.new
transactionInfo[:unclassifiedTransaction] = Hash.new
transaction = transactionInfo[:transactions]
unclassifiedTransaction = transactionInfo[:unclassifiedTransaction]
wordListToCheckAgainst.each do |word|
transaction[word] = Array.new
unclassifiedTransaction[:unclassifiedTransaction] = Array.new
File.open(fileToParse).readlines.each do |line|
if transaction = /(?<transaction>)#{word}/.match(line)
date = /(?<Month>\d{1,2})\D(?<Day>\d{2})\D(?<Year>\d{4})/.match(line).to_s
transaction = /(?<transaction>)#{word}/.match(line).to_s
amount =/-+(?<dollars>\d+)\.(?<cents>\d+)/.match(line).to_s
transactions[word].push({:date => date,
:name => transaction, :amount => amount.to_f.round(2)})
# this is problem: else/elsif don't push only if match fails
else
date = /(?<Month>\d{1,2})\D(?<Day>\d{2})\D(?<Year>\d{4})/.match(line).to_s
transaction = /(?<Middle>)".*"/.match(line).to_s
amount =/-*(?<dollars>\d+)\.(?<cents>\d+)/.match(line).to_s
unclassifiedTransaction[:unclassifiedTransaction].push({:date => date,
:name => transaction, :amount => amount.to_f.round(2)})
next
end
end
return transactionInfo
end
任何想法都會很棒。我研究過這個,我覺得我已經通過向社區伸出手而擊敗了。我意識到正則表達式可能不是最好的方法,所以我願意接受所有的反饋。
你應該添加的輸入格式的一小部分。這看起來像XML,但不是真的嗎? – tadman
你是什麼意思的「陣列/散列」?你不知道你的數據結構會是什麼?或者,你的意思是說它是一組「哈希」?如果是這樣,那麼使用正確的名稱,因爲第一個是模糊的,會導致無意義的代碼和混淆的答案。 –
您的示例代碼不會被解析。它缺少一個結束'結束'。 –