2

2 つの基準に基づいて特定のセル値を返そうとしています。

ロジック:

If ClientID = 1 and BranchID = 1, puts SurveyID

Ruby 1.9.3を使用して、基本的にExcelファイルを調べて、ClientIDandBranchID列内にある2つの特定の値について、列に対応する値を返し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か?

4

2 に答える 2

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
于 2013-08-21T22:46:11.017 に答える