2017-01-11 43 views
0

私はRuby 2.4を使用しています。特定の区切り文字があれば、CSVファイルの文字列を行として扱い、区切り文字を使ってその行をトークンの配列に分割するにはどうすればよいですか?文字列(ファイルではない)をCSVファイルの行として扱い、その文字列を解析するにはどうすればよいですか?

など、すべての例がオンラインで見つかりました。私の行をファイルに書き込んだり、そのファイルを読み込んだり、作成した一時ファイルを削除したりするのは無駄です。区切り文字がカンマの場合は、「分割」機能を使用しても安全ではないように見える場合があります。これは、CSVファイルがデータにカンマを持つことがあるためです(引用符がデータを囲む)。渡された区切り文字が "\ tの" である場合

そのような文字列の例は

a,b,c,d,e 

かもしれない、その結果は[ "B、C、D、E"]であろうが、もし

+1

組み込みCSVモジュールが同等の場合にFasterCSVを使用する理由がわかりません。 – tadman

+0

@tadmanは言ったように、FasterCSV _ Rubyの組み込みCSVですので、わかりやすくシンプルにするためにCSVを使用してください。次に、[ドキュメント](http://ruby-doc.org/stdlib-2.4.0/libdoc/csv/rdoc/CSV.html)のサンプルをよく読んでみることをお勧めします。 –

答えて

2

の場合任意の文字列データをCSVとして解析したい場合は、parseを使用します。一時ファイルの必要はありません:

require 'csv' 

commas = %Q[a,b,"c,d"] 

CSV.parse(commas) 
# => [["a", "b", "c,d"]] 

tabs = %Q[a\tb\t"c\td"] 

CSV.parse(tabs, col_sep: "\t") 
# => [["a", "b", "c\td"]] 

col_sepオプションが使用されているものを、セパレータを指定することができます。

4

FasterCSVは長い間、Ruby標準ライブラリのadopted as the CSV moduleになっています。ちょうどrequire "csv"

CSVドキュメントの概要は、CSV.parse_lineの方法を明らかにしています。

require "csv" 
CSV.parse_line("a,b,c,d,e") 
# => ["a", "b", "c", "d", "e"] 

CSV.parseあなたの代わりにセパレータとしてタブを使用するcol_sep: "\t"オプションを渡すことができますので、らthe same options as CSV.newのすべてを取ります

CSV.parse_line("a,b,c,d,e", col_sep: "\t") 
# => ["a,b,c,d,e"] 

はrepl.itでそれを参照してください:https://repl.it/FGft/1

+0

あなたの例では、 'CSV.parse_line( "a、b、c、d、e")'はどのようにトークン区切りが何であるかを知っていますか? –

+0

デフォルトではカンマ(「CSV」は「カンマ区切りの値」を意味します)です。私が言ったように、それは 'CSV.new'と同じオプション(https://ruby-doc.org/stdlib-2.3.3/libdoc/csv/rdoc/CSV.html#method-c-new)をとります。 'col_sep:" \ t "'オプションを渡して、代わりにタブを使うことができます。私は2番目の例で私の答えを更新しました。 –

関連する問題