LoginSignup
0
0

More than 1 year has passed since last update.

CSVから特定の列のデータだけを抜き取るスクリプトを書く

Posted at

何をしたか

CSVから特定の列のデータだけを抜き取るスクリプトを作成しました。

具体的な内容

下記のようなCSVで、会員の情報があります。
このデータのID情報のみ配列で取得することが目的です。

list.csv
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を利用しました。

ids.rb
["16452", "64366", "35434", "66466", "56436", "66468", "72854", "87537", "97273", "10346"]

CSV添付ライブラリを利用する方法

requireで添付ライブラリを読み込み、
CSV.foreachにキーワード引数headerstrueにすることで、
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の学習の際にFileIODirあたりのクラスは普段あまり利用しないため覚えるのが大変でしたが、
実際に何か処理を作ってみると記憶に残りやすいなと思いました。

参考文献

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0