RubyでCSVファイルを読み込んで解析する方法

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

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

例:

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

これはCSVファイルのようなものです:

id,name1,chocolate2,bacon3,apple4,banana5,almonds

ここでは、Ruby CSVライブラリを使用して&write CSVファイルを読み取る方法を学びます。

Ruby CSV Parsing

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

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

require 'csv'CSV.read("favorite_foods.csv")

または、CSVデータを使用して文字列を解析することもできます:

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

結果は?

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

これは次のようになります:

, , , , , ]

このデータを操作するには、dataのような配列インデックスを使用できます。

しかし、より良い方法があります!

CSVオプション

ファイルにヘッダーがある場合は、CSVパーサーにそれらを使用するように指示できます。多次元配列の代わりにCSVテーブルオブジェクトを取得します。

:

“ACSV::Tableは、CSV文書を表現するための2次元データ構造です。 テーブルを使用すると、行または列ごとにデータを操作したり、データを操作したり、結果をCSVに変換したりすることができます。”

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

:

table# "1"table# "chocolate"

ここで0は最初の行です, id & name は列名です。

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

  • by_col
  • by_row

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

:

table.by_col# table.by_col# 

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

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

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

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

CSVコンバータの使い方

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

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

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

しかし、ショートカットがあります!

Ruby CSVライブラリはconvertersと呼ばれるものを実装しています。

コンバータは自動的に値を変換します。例えば

:

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

6つの作り付けのコンバーターがあります:

  • Integer
  • Float
  • Numeric(Float+Integer)
  • Date
  • DateTime
  • All

しかし、あなたはまた、独自のカスタムコンバータを作成することができます。

:

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

あなたはこのようなあなたの新しいコンバータを使用することができます:

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

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

解析できる上に、さまざまな方法でCSVファイルを読み取るあなたはまた、ゼロからCSVを作成することができます。

これは簡単な方法です:

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

また、generateメソッドを使用することもできます:

CSV.generate do |csv| csv 

This prepares the data to be in the right format.

If you want to write to a file you'll have to use something like , or instead of you can use with a file name & write mode enabled.

CSV.open("cats.csv", "w") do |csv| csv 

Now you have a new CSV file!

CSV Gems & Performance

The built-in library is fine & it will get the job done.

But you can also find a few CSV parsing gems with different features.

For example, the gem will convert your CSV data into an array of hashes.

Example:

require 'smarter_csv'IntegerConverter = Object.newdef IntegerConverter.convert(value) Integer(value)endSmarterCSV.process('testing.csv', value_converters: { id: IntegerConverter })# 

ここでは、パフォーマンスの比較です:

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

概要

RubyでCSVファイルを書く&の読み方を学びました! また、CSVデータを処理するためのconverters&代替Ruby gemについても学習しました。大きなCSVファイル(>10MB)を処理する場合は、ブロックでCSV.foreach(file_name)メソッドを使用することができます。 これは一度に1行ずつ読み込まれます&使用するメモリははるかに少なくなります。

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

コメントを残す

メールアドレスが公開されることはありません。