3

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")
4

2 に答える 2

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"]
于 2009-07-10T00:00:51.267 に答える
1

私は Ruby の専門家ではないので、そのようなエラーは許してください。

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

Perl 互換の正規表現を使用して 2 つのステップで実行できますが、インストールしたバージョンの Ruby で試してみると、Ruby が文句を言いました。通常、ファイル全体を読み込んでから、負の後読みを使用してファイルを分割し、それから返された各要素を , で分割します。

例えば:

$allLines=$wholeFile.split(/(?<!\\)\n/m);

しかし、Ruby は (?<! シーケンスが認識されないことを訴えています。したがって、おそらく他の方法に頼る必要があるでしょう。CSV を解析するために特別に設計されたライブラリをお勧めします: http://snippets.aktagon .com/snippets/246-How-to-parse-CSV-data-with-Ruby

于 2009-07-09T20:29:08.057 に答える