🔢

【Ruby】CSV.parseメソッドで読み込まれたすべてのデータは文字列として扱われる

2024/06/06に公開

はじめに

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データをより効率的に扱うことができるようになります。

参考

https://docs.ruby-lang.org/ja/latest/method/CSV/s/parse.html

Discussion