🔢
【Ruby】CSV.parseメソッドで読み込まれたすべてのデータは文字列として扱われる
はじめに
RubyのCSV.parse
メソッドを使用すると、CSVファイルから読み込まれたすべてのデータは文字列として扱われます。 このため、CSVファイルに数値が含まれていても、それらは文字列として読み込まれます。今回は、CSVファイルの数値データを適切に処理する方法について説明します。
CSV.parse
の基本的な使い方
まず、CSV.parse
メソッドの基本的な使い方を見てみましょう。以下の例では、CSVデータを文字列として読み込み、各行を配列として取得します。
require 'csv'
csv_data = <<~DATA
name,age,score
Alice,30,85
Bob,25,90
Charlie,35,78
DATA
parsed_data = CSV.parse(csv_data, headers: true)
parsed_data.each do |row|
puts row.to_h
end
このコードを実行すると、以下のような出力が得られます。
{"name"=>"Alice", "age"=>"30", "score"=>"85"}
{"name"=>"Bob", "age"=>"25", "score"=>"90"}
{"name"=>"Charlie", "age"=>"35", "score"=>"78"}
ご覧のとおり、すべての値が文字列として扱われています。
数値データを適切に処理する方法
数値データを適切に処理するためには、読み込んだ後に明示的に型変換を行う必要があります。以下に、その方法を示します。
require 'csv'
csv_data = <<~DATA
name,age,score
Alice,30,85
Bob,25,90
Charlie,35,78
DATA
parsed_data = CSV.parse(csv_data, headers: true)
parsed_data.each do |row|
row['age'] = row['age'].to_i
row['score'] = row['score'].to_i
puts row.to_h
end
このコードを実行すると、以下のように数値データが整数として処理されます。
{"name"=>"Alice", "age"=>30, "score"=>85}
{"name"=>"Bob", "age"=>25, "score"=>90}
{"name"=>"Charlie", "age"=>35, "score"=>78}
ユーティリティメソッドの作成
毎回手動で型変換を行うのは手間がかかるため、ユーティリティメソッドを作成して処理を簡略化しましょう。
require 'csv'
def parse_csv_with_types(csv_data, headers: true)
parsed_data = CSV.parse(csv_data, headers: headers)
parsed_data.each do |row|
row.each do |header, value|
if value.match?(/^\d+$/)
row[header] = value.to_i
elsif value.match?(/^\d+\.\d+$/)
row[header] = value.to_f
end
end
end
parsed_data
end
csv_data = <<~DATA
name,age,score
Alice,30,85
Bob,25,90
Charlie,35,78.5
DATA
parsed_data = parse_csv_with_types(csv_data)
parsed_data.each do |row|
puts row.to_h
end
このコードでは、整数と浮動小数点数の両方に対応する型変換を自動的に行います。実行結果は以下の通りです。
{"name"=>"Alice", "age"=>30, "score"=>85}
{"name"=>"Bob", "age"=>25, "score"=>90}
{"name"=>"Charlie", "age"=>35, "score"=>78.5}
まとめ
CSV.parse
メソッドを使用する際、数値データを文字列として読み込む問題に直面することがあります。本記事では、その問題を解決するための方法として、手動での型変換とユーティリティメソッドの作成を紹介しました。これにより、CSVデータをより効率的に扱うことができるようになります。
参考
Discussion