何をしたか
CSVから特定の列のデータだけを抜き取るスクリプトを作成しました。
具体的な内容
下記のようなCSVで、会員の情報があります。
このデータのID情報のみ配列で取得することが目的です。
id,last_name,first_name,gender
16452,John,Moore,0
64366,Barbara,Stanwyck,1
35434,Paris,Williams,1
66466,Hailey,Brown,1
56436,Mike,Miller,0
66468,Sara,Anderson,1
72854,Carl,Taylor,0
87537,Chad,Smith,0
97273,Paul,Harris,0
10346,Bella,Freud,1
.
.
.
ちょうどRuby Silverの資格取得のため学習していた「IO」クラスが使えると思い、スクリプトを書いてみました。
どのようにしたか
- 組み込みライブラリであるIOクラスを利用する方法
- 添付ライブラリであるCSVクラスを利用する方法
IOクラスを利用する方法
IO.foreach
を利用することで直接ファイル名を指定しつつ、
ファイルの各行に対して処理を実行できます。
ファイルの各行に対しては、
"id,last_name,first_name,gender\n"
というような文字列が渡ってくるため、
String#split
を利用してカンマを対象に配列に変換します。
この結果として
["id", "last_name", "first_name", "gender\n"]
という文字列の配列が返ってくるため、
IDが格納されている配列の0番目をArray#first
によって取得しています。
取得した要素をresultという空の配列にArray#<<
を利用して破壊的に追加していきます。
result = []
IO.foreach('list.csv') {|row| result << row.split(',').first }
# headerを取り除く
result.shift #=> "id"
IO.write('ids.rb', result)
resultでは最初の要素にCSVファイルのheaderの「"id"」が入っているため
Array#shift
で破壊的に取り出しています。
ファイルへの書き込みは、IO.write
を利用しました。
["16452", "64366", "35434", "66466", "56436", "66468", "72854", "87537", "97273", "10346"]
CSV添付ライブラリを利用する方法
require
で添付ライブラリを読み込み、
CSV.foreach
にキーワード引数headers
をtrue
にすることで、
CSVファイルの一行目をヘッダとして扱うため、
headerを取り除いて処理を実行できます。
foreachの引数に指定できるオプションの参考文献
CSVクラスを利用する場合、ブロック引数には各行のカンマ区切りの配列が渡されます。
そのため、idが格納されている0番目をArray#[]
で取得しています。
require 'csv'
result = []
CSV.foreach('list.csv', headers: true) { |row| result << row[0] }
IO.write('ids.rb', result)
まとめ
こんなスクリプトをわざわざ作らなくても、
VSCodeの正規表現を利用したり、
そもそもCSVファイルにデータを出力する際にidだけにすればいいのでは?とも思いましたが、
Ruby Silverの学習のために利用してみました。
Ruby Silverの学習の際にFile
、IO
、Dir
あたりのクラスは普段あまり利用しないため覚えるのが大変でしたが、
実際に何か処理を作ってみると記憶に残りやすいなと思いました。