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