RubyでCSVファイルをフィルタリングして新しいCSVファイルに出力する方法
この記事では、RubyでCSVファイルを読み込み、特定の条件に一致する行を抽出し、新しいCSVファイルに出力する方法を初学者向けに解説します。
準備
まず、RubyでCSVファイルを操作するためには、標準ライブラリであるcsv
を読み込む必要があります。
Ruby
require 'csv'
入力ファイルと出力ファイルの設定
次に、入力ファイル名、出力ファイル名、およびフィルタリング条件として部署名を指定します。
Ruby
input_filename = 'employees.csv'
output_filename = 'filtered_employees.csv'
target_department = 'Engineering'
CSVファイルの読み込みとデータの抽出
csv_headers
とfiltered_data
という2つの配列を用意します。csv_headers
はヘッダー行を格納し、filtered_data
はフィルタリングされたデータを格納します。
Ruby
csv_headers = []
filtered_data = []
-
CSV.foreach
メソッドを使って、入力ファイルを読み込みます。headers: true
オプションを指定することで、ヘッダー行を扱いやすくします。 - headers: trueオプションを指定することで、CSV.foreachがヘッダー行(最初の行)を特別に扱い、カラム名をキーとして値にアクセスできるようになります。これにより、カラムの位置に依存せずに、カラム名でデータにアクセスできるため、コードの可読性と保守性が向上します。
-
row.headers
のheaders
はメソッドで、現在処理している行が持っているカラムに格納されているデータを返します。このメソッドはCSVライブラリのCSV::Rowオブジェクトに対して呼び出されます(つまり、行に対してのみ使用可能)。 -
csv_headers = row.headers if csv_headers.empty?
の部分はcsv_headers
がnilの場合に現在読み込んでいる行のカラムに格納されているデータをヘッダーとして使用させるための記述です。
CSV.foreach(input_filename, headers: true) do |row|
csv_headers = row.headers if csv_headers.empty?
# 特定の部署に所属する従業員を抽出
if row['department'] == target_department
filtered_data << row
end
end
抽出したデータを新しいCSVファイルに出力
最後に、CSV.open
メソッドを使って新しいCSVファイルを作成し、抽出したデータを出力します。
- CSV.openメソッドは、RubyのCSVライブラリに含まれるメソッドで、CSVファイルを開いて読み書きするために使用されます。
-
CSV.open(output_filename, 'w') do |csv|
のw
は、ファイルを書き込みモードで開くことを意味します。このモードでファイルを開くと、新しいファイルが作成され、既存のファイルがある場合は内容が上書きされます。このモードで開いたファイルに対して、データを書き込むことができます。
CSV.open(output_filename, 'w') do |csv|
csv << csv_headers
filtered_data.each do |row|
csv << row
end
end
これで、特定の条件に一致する行を抽出し、新しいCSVファイルに出力するRubyプログラムが完成しました。このコードをカスタマイズして、さまざまな条件でデータをフィルタリングすることができます。