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テーブルオブジェクトを取得します。
:
“A
CSV::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| csvThis 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| csvNow 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行ずつ読み込まれます&使用するメモリははるかに少なくなります。より多くの人々がそれを見つけることができるように、この記事を共有してください!