我试图根据两个标准返回特定的单元格值。
逻辑:
If ClientID = 1 and BranchID = 1, puts SurveyID
使用Ruby 1.9.3,我想基本查看excel文件以及ClientID
和BranchID
列中的两个特定值,返回SurveyID
中的相应值列。
这是我到目前为止所做的,这是我在网上搜索时发现的。这似乎很有希望,但没有运气:
require 'csv'
# Load file
csv_fname = 'FS_Email_Test.csv'
# Key is the column to check, value is what to match
search_criteria = { 'ClientID' => '1',
'BranchID' => '1' }
options = { :headers => :first_row,
:converters => [ :numeric ] }
# Save `matches` and a copy of the `headers`
matches = nil
headers = nil
# Iterate through the `csv` file and locate where
# data matches the options.
CSV.open( csv_fname, "r", options ) do |csv|
matches = csv.find_all do |row|
match = true
search_criteria.keys.each do |key|
match = match && ( row[key] == search_criteria[key] )
end
match
end
headers = csv.headers
end
# Once matches are found, we print the results
# for a specific row. The row `row[8]` is
# tied specifically to a notes field.
matches.each do |row|
row = row[1]
puts row
end
我知道matches.each do |row|
之后的最后一段代码是无效的,但是我把它留下来希望对其他人有意义。
如何撰写puts surveyID if ClientID == 1 & BranchID == 1
?
答案 0 :(得分:3)
你确实很亲密。您唯一的错误是将search_criteria
哈希的值设置为字符串'1'
而不是数字。由于您converters: :numeric
位于find_all
,1
正在比较'1'
与false
并获得Hash[row].select { |k,v| search_criteria[k] } == search_criteria
。你可以改变它,你已经完成了。
或者这应该适合你。
关键是行
Hash[row]
search_criteria
将行转换为哈希而不是数组数组。 Select生成一个新哈希,该哈希只包含require 'csv'
# Load file
csv_fname = 'FS_Email_Test.csv'
# Key is the column to check, value is what to match
search_criteria = {
'ClientID' => 1,
'BranchID' => 1,
}
options = {
headers: :first_row,
converters: :numeric,
}
# Save `matches` and a copy of the `headers`
matches = nil
headers = nil
# Iterate through the `csv` file and locate where
# data matches the options.
CSV.open(csv_fname, 'r', options) do |csv|
matches = csv.find_all do |row|
Hash[row].select { |k,v| search_criteria[k] } == search_criteria
end
headers = csv.headers
end
p headers
# Once matches are found, we print the results
# for a specific row. The row `row[8]` is
# tied specifically to a notes field.
matches.each { |row| puts row['surveyID'] }
中显示的那些元素。然后只需比较两个哈希值,看它们是否相同。
{{1}}
答案 1 :(得分:0)
...可能
require 'csv'
b_headers = false
client_id_col = 0
branch_id_col = 0
survey_id_col = 0
CSV.open('FS_Email_Test.csv') do |file|
file.find_all do |row|
if b_headers == false then
client_id_col = row.index("ClientID")
branch_id_col = row.index("BranchID")
survey_id_col = row.index("SurveyID")
b_headers = true
if branch_id_col.nil? || client_id_col.nil? || survey_id_col.nil? then
puts "Invalid csv file - Missing one of these columns (or no headers):\nClientID\nBranchID\nSurveyID"
break
end
else
puts row[survey_id_col] if row[branch_id_col] == "1" && row[client_id_col] == "1"
end
end
end