3


0

Rubyで改行文字をエスケープしたCSVファイルを解析するにはどうすればいいですか? CSVやFasterCSVには明白なものはありません。

これが入力例です。

"foo"、 "bar" "rah"、 "baz \ and stuff"、 "green"、 "red"

Pythonでは、これを行います。

csvFile = "foo.csv" csv.register_dialect( 'blah'、escapechar = '\\')csvReader = csv.reader(open(csvFile)、 "blah")

2 Answer


7


改行を含むフィールドが(あなたの例のデータのように)適切に引用符で囲まれていれば、Rubyのcsvパーサーはそれらをうまく扱えます。 ただし、Rubyがエスケープ文字を削除することを望む場合(Pythonが `+ escapechar +`を設定することでできるように)、Rubyのドキュメントにはその方法もありません。 (ところで、Ruby 1.9では、FasterCSVはRubyのデフォルトのcsv実装です。)

#!/usr/bin/env ruby -w
require 'csv'

CSV.foreach('test.csv') do |rec|
  puts "Record: #{rec}"
end

出力:

telemachus ~ $ ruby read.rb
Record: ["foo", "bar"]
Record: ["rah", "baz \\\nand stuff"]
Record: ["green", "red"]


1


私はRubyのエキスパートではないので、これらの行に沿ったエラーはすべて許してください。

あなたは(私が知っている)正規表現を使用して単一のステップでこれを行うことはできません。 上記のPythonコードは正規表現ではないので、同じことをする正規表現を使うことを期待しないでください。

Perl互換の正規表現を使って2つのステップでそれを行うことができますが、私がインストールしたRubyのバージョンでそれを試したとき、Rubyは不平を言いました。 一般的には、ファイル全体を読み込んでから、負の先読みを使用してファイルをsplit()し、次にaから返された各要素をsplit()します。

例えば:

$ allLines = $ wholeFile.split(/(?

しかしRubyは(?http://snippets.aktagon.com/snippets/246-How-to-parse-CSV-data-with-Ruby