Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

RubyでCSVファイルを読み取って解析する方法

CSVは「カンマ区切り値」の略です。

これは、値がコンマで区切られた行で構成される一般的なデータ形式です。データのエクスポートとインポートに使用されます。

Gmailの連絡先をCSVファイルとしてエクスポートできます。また、同じ形式を使用してインポートすることもできます。

これはCSVファイルの外観です

id,name
1,chocolate
2,bacon
3,apple
4,banana
5,almonds

次に、RubyCSVライブラリの使用方法を学習します。 CSVファイルの読み取りと書き込み。

RubyCSV解析

RubyにはCSVライブラリが組み込まれています。

ファイルを直接読み取ることができます

require 'csv'

CSV.read("favorite_foods.csv")

または、CSVデータを含む文字列を解析することができます :

require 'csv'

CSV.parse("1,chocolate\n2,bacon\n3,apple")

結果は?

すべてのエントリがテーブルの1行である2次元配列を取得します。

このように見えます

[
  ["id", "name"],
  ["1", "chocolate"],
  ["2", "bacon"],
  ["3", "apple"],
  ["4", "banana"],
  ["5", "almonds"]
]

data [1] [1]のような配列インデックスを使用できます このデータを処理します。

しかし、もっと良い方法があります!

CSVオプション

ファイルにヘッダーがある場合は、CSVパーサーにヘッダーを使用するように指示できます。

このように

table = CSV.parse(File.read("cats.csv"), headers: true)

これで、多次元配列の代わりに、CSVテーブルオブジェクトを取得できます。

説明は次のとおりです

CSV::Table CSVドキュメントを表すための2次元データ構造です。テーブルを使用すると、行または列ごとにデータを操作したり、データを操作したり、結果をCSVに変換したりすることができます。」

これらのテーブルの1つを指定すると、任意の行から必要なデータを取得できます。

table[0]["id"]
# "1"

table[0]["name"]
# "chocolate"

ここで0 最初の行はid名前 列名です。

2つのテーブルモードがあります

  • by_col
  • by_row

テーブルモードを変更する( row デフォルトでは)さまざまな角度からデータを見ることができます。

table.by_col[0]
# ["1", "2", "3", "4", "5"]

table.by_col[1]
# ["chocolate", "bacon", "apple", "banana", "almonds"]

ここで0 最初の列は1 2番目の列です。

これらの2つのメソッドは、テーブルのコピーを返します 。

元のテーブルに変更を加える場合は、 by_col!を使用できます。 & by_row! メソッド。

テーブルのコピーが作成されないため、これによりメモリ効率が向上します。

CSVコンバータの使用方法

idを取得したことにお気づきかもしれません 文字列の配列としての列。

整数が必要な場合はどうなりますか?

to_iを呼び出すことで取得できます 各文字列に…

しかし、近道があります!

Ruby CSVライブラリは、コンバーターと呼ばれるものを実装します 。

コンバーターが自動的に値を変換します。

CSV.parse("1,2,3,4,5")
# [["1", "2", "3", "4", "5"]]

CSV.parse("1,2,3,4,5", converters: :numeric)
# [[1, 2, 3, 4, 5]]

6つの組み込みコンバーターがあります

  • 整数
  • フロート
  • 数値(浮動小数点+整数)
  • 日付
  • DateTime
  • すべて

ただし、独自のカスタムコンバーターを作成することもできます。

方法は次のとおりです

CSV::Converters[:symbol] = ->(value) { value.to_sym rescue value }

このように新しいコンバーターを使用できます

CSV.parse("a,b,c", headers: false, converters: :symbol)

# [[:a, :b, :c]]

新しいCSVファイルを作成する方法

さまざまな方法でCSVファイルを解析および読み取ることができることに加えて、CSVを最初から作成することもできます。

これは簡単な方法です

cats = [
  [:blue, 1],
  [:white, 2],
  [:black_and_white, 3]
]

cats.map { |c| c.join(",") }.join("\n")

generateを使用することもできます 方法:

CSV.generate do |csv|
  csv << [:blue, 1]
  csv << [:white, 2]
  csv << [:black_and_white, 3]
end

これにより、データが正しい形式になるように準備されます。

ファイルに書き込みたい場合は、 File.write( "cats.csv"、data)のようなものを使用する必要があります 、または generateの代わりに openを使用できます ファイル名と書き込みモードが有効になっています。

このように

CSV.open("cats.csv", "w") do |csv|
  csv << [:white, 2]
end

これで、新しいCSVファイルができました!

CSVの宝石とパフォーマンス

組み込みのライブラリは問題なく、仕事をこなしてくれます。

ただし、さまざまな機能を備えたCSV解析gemもいくつかあります。

たとえば、 smarter_csv gemはCSVデータをハッシュの配列に変換します。

require 'smarter_csv'

IntegerConverter = Object.new

def IntegerConverter.convert(value)
  Integer(value)
end

SmarterCSV.process('testing.csv', value_converters: { id: IntegerConverter })

# [{:id=>1, :name=>"a"}, {:id=>2, :name=>"b"}, {:id=>3, :name=>"c"}]

これがパフォーマンスの比較です

Comparison:
       CSV:      112.9 i/s
Smarter CSV:     21.7 i/s - 5.21x  slower
   Tabular:      17.3 i/s - 6.52x  slower

概要

RubyでCSVファイルを読み書きする方法を学びました!また、CSVデータを処理するためのコンバーターと代替のRubygemについても学びました。

大きなCSVファイルを処理する場合 (> 10MB) CSV.foreach(file_name)を使用することをお勧めします ブロックを使用したメソッド。これにより、一度に1行が読み取られ、メモリの使用量が大幅に削減されます。

より多くの人が見つけられるように、この記事を共有してください!


  1. Rubyでパーサーを構築する方法

    構文解析は、一連の文字列を理解し、それらを理解できるものに変換する技術です。正規表現を使用することもできますが、必ずしもその仕事に適しているとは限りません。 たとえば、HTMLを正規表現で解析することはおそらく良い考えではないことは一般的な知識です。 Rubyには、この作業を実行できるnokogiriがありますが、独自のパーサーを作成することで多くのことを学ぶことができます。始めましょう! Rubyでの解析 パーサーの中核はStringScannerです クラス。 このクラスは、文字列のコピーと位置ポインタを保持します。ポインタを使用すると、特定のトークンを検索するために文字列をトラバ

  2. OneDrive ファイルを他のユーザーと共有する方法

    Microsoft OneDrive は、Windows の既定のオンライン ストレージおよび同期サービスです。信じられないほど幅広い機能が搭載されているため、このアプリはほとんどすべての競合他社よりも優れていると言っても過言ではありません。 OneDrive を使用すると、ドキュメントをオンラインで保存したり、Web アプリケーションで Microsoft Office (Word、PowerPoint、Excel) にアクセスしたりできます。さらに、Microsoft 365 を購読しているかどうかに関係なく、パートナー、サプライヤー、クライアント、顧客など、組織外の人々と安全に共同作