RubyでのCSVからの入力出力。コンソール出力はファイル出力とは異なります

概要

RubyでCSVアプリケーションを学習しています。

文字列を受け取り、開始アルファベットに基づいて単語を検索する関数があります。

今、私はたくさんの文字列を含むファイルを読み取ろうとしていますが、プログラムはそれを読み取って別のcsvファイルに出力を与える必要があります。

私の関数は動作しており、CSVも入力されています。コンソールに出力が表示され、それが正しいためです。出力CSVに書き込めないだけで、その理由がわかりません。

以下のようなコード

require 'csv'

# Define a hash containing adjectives for each letter
adjectives_by_letter = {
  'a' => ['awesome', 'amazing’],
  'b' => ['beautiful', 'brave'],
  'c' => ['calm', 'clever'],
}

# Method to match each letter to a set of adjectives
def match_to_adjectives(letters, adjectives)
  matched_adjectives = {}

  letters.each do |letter|
    print "#{letter.upcase}: "
    available_adjectives = adjectives[letter.downcase] - matched_adjectives.values
    if available_adjectives.empty?
      puts "No available adjectives found for '#{letter}'"
    else
      adjective = available_adjectives.sample
      matched_adjectives[letter] = adjective
      puts adjective.upcase
    end
    puts "\n"
  end
end


# Define the input and output file paths
input_file = 'names.csv'
output_file = 'output.csv'

# Open the input file for reading
CSV.open(input_file, 'r') do |csv_in|
  # Open the output file for writing
  CSV.open(output_file, 'w') do |csv_out|
    # Iterate over each row in the input CSV
    csv_in.each do |row|
      # Extract the name from the row
      name = row[0]
      letters = name.chars
      results = match_to_adjectives(letters, adjectives_by_letter)
      
      # Write the name and its length to the output CSV
      csv_out << [ results ]
    end
  end
end

名前を入力する

ハイネケン ステラ

コンソールへの出力

A: ACTIVE



[Finished in 634ms]

Output.csvに出力

"[""h"", ""e"", ""i"", ""n"", ""e"", ""k"", ""e"", ""n""]"
"[""s"", ""t"", ""e"", ""l"", ""l"", ""a""]"


csv_out で犯した間違いは何ですか?

解決策

この関数は出力をコンソールに出力しますが、CSV ファイルに書き込むために外部コードで使用できるものは何も返しません。 したがって、match_to_adjectives を呼び出すと、何も返されず、コンソールに出力されるだけです

# Method to match each letter to a set of adjectives and return them
def match_to_adjectives(letters, adjectives)
  matched_adjectives = []
  letters.each do |letter|
    available_adjectives = adjectives[letter.downcase] || []
    if available_adjectives.empty?
      # Optionally, handle the case when no adjectives are found for a letter
      matched_adjectives << "No adjective for '#{letter}'"
    else
      adjective = available_adjectives.sample
      matched_adjectives << adjective
    end
  end
  matched_adjectives
end

# Define the input and output file paths
input_file = 'names.csv'
output_file = 'output.csv'

# Open the input file for reading
CSV.open(input_file, 'r') do |csv_in|
  # Open the output file for writing
  CSV.open(output_file, 'w') do |csv_out|
    # Iterate over each row in the input CSV
    csv_in.each do |row|
      # Extract the name from the row
      name = row[0]
      letters = name.chars
      results = match_to_adjectives(letters, adjectives_by_letter)
      
      csv_out << [name, results.join(', ')] # Adjust the join delimiter as needed
    end
  end
end