我编写了一个简单的程序来解析我的银行交易 CSV 文件。我的表达式将结果推送到将保存到数据库的数组/哈希数据结构。
有两个部分:
- 一种打开文件、读取每一行并推送它的运行方法。
- 从哈希中提取数据的视图。
我在下面包含了我的主要解析方法。它检查每一行的关键字,如果匹配失败,它应该推送到未分类的哈希。但是,条件会根据我是否使用elsif
或来推送 ALL 或 NO 事务else
。
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
任何想法都会很棒。我对此进行了研究,我觉得接触社区已经失败了。我意识到正则表达式可能不是最好的方法,所以我愿意接受所有反馈。