0
0

More than 3 years have passed since last update.

ruby でタブ区切りで並び替えしたい

Posted at

タブ区切りのテキストから並び替えをして見やすくしたと備忘録

まず、もととなるタブ区切りのテキスト

profile.txt #LR utf-8 
john    m   19
micheal m   28
abbie   f   31
dabid   m   17
claire  f   26

左から”名前、性別、歳”がタブ区切りで載っています。
名前順にして並び替えたいと思います。

まず、テキスト自体どういう風に出力されるか確認します。

File.open("meibo.txt") do |text|
  text.each_line do |line|
    p line
  end
end

でファイルを展開すると

$ ruby example.rb
"john\tm\t19\n"
"micheal\tm\t28\n"
"abbie\tf\t31\n"
"dabid\tm\t17\n"
"claire\tf\t26\n"

と表されるので、タブスペースと改行コードを除いた各行の配列を作り
ソートして、標準出力します。

大まかな流れ

1.ファイルを開き、読み込みができるようにする
2.名前順にソートをかける
3.標準出力する

1.ファイルを開き、読み込みする

各行を[名前,性別,年齢]のようにして一旦、配列に入れます。

profile = []

File.open("profile.txt") do |text|
  text.each_line do |line|
    profile << line.chomp.split("\t")
  end
end

各行の末文に\nを取り除くために.chompしタブ区切りしているので.split("\t")区切りることによって

$ ruby example.rb
[["john", "m", "19"],
["micheal", "m", "28"],
["abbie", "f", "31"],
["dabid", "m", "17"],
["claire", "f", "26"]]

という風に配列profileが綺麗に[名前,性別,年齢]と必要なデータだけ取れました。

2.名前順にソートをかける

rubyにはsort_byメソッドがあるのでこのメソッドを利用して名前順にします。

profile_sort =  profile.sort_by{|man| man[0]}
pp profile_sort

出力結果は

$ ruby example.rb
[["abbie", "f", "31"],
["claire", "f", "26"],
["dabid", "m", "17"],
["john", "m", "19"],
["micheal", "m", "28"]]

となり、無事名前順に並び変わりました。

3.標準出力する

ここまできたら、ソートした配列を出力しリダイレクトして並び替えをします。

profile_sort.each do |text|
  puts text.join("\t")
end

配列の文字列を\tで繋いで連結します。putsで出力された時にタブく区切りされるようになります。
また、putsは改行して出力してくれるのでわざわざputs text.join("\t")+"\n"
改行コードを書かなくても大丈夫です。

これを実行して出力結果が

$ ruby example.rb
abbie   f   31
claire  f   26
dabid   m   17
john    m   19
micheal m   28

はい、これでタブ区切りのファイルを並び替えが成功しました。

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