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行が読み取られ、メモリの使用量が大幅に削減されます。
より多くの人が見つけられるように、この記事を共有してください!
-
Rubyでパーサーを構築する方法
構文解析は、一連の文字列を理解し、それらを理解できるものに変換する技術です。正規表現を使用することもできますが、必ずしもその仕事に適しているとは限りません。 たとえば、HTMLを正規表現で解析することはおそらく良い考えではないことは一般的な知識です。 Rubyには、この作業を実行できるnokogiriがありますが、独自のパーサーを作成することで多くのことを学ぶことができます。始めましょう! Rubyでの解析 パーサーの中核はStringScannerです クラス。 このクラスは、文字列のコピーと位置ポインタを保持します。ポインタを使用すると、特定のトークンを検索するために文字列をトラバ
-
OneDrive ファイルを他のユーザーと共有する方法
Microsoft OneDrive は、Windows の既定のオンライン ストレージおよび同期サービスです。信じられないほど幅広い機能が搭載されているため、このアプリはほとんどすべての競合他社よりも優れていると言っても過言ではありません。 OneDrive を使用すると、ドキュメントをオンラインで保存したり、Web アプリケーションで Microsoft Office (Word、PowerPoint、Excel) にアクセスしたりできます。さらに、Microsoft 365 を購読しているかどうかに関係なく、パートナー、サプライヤー、クライアント、顧客など、組織外の人々と安全に共同作