3

CSVファイルの行区切り文字として角かっこ「[]」を使用しようとしています。このプロジェクトでは、この正確な形式を使用する必要があります(出力はLEDES98法の請求形式と正確に一致する必要があります)。

私はこれをやろうとしています:

CSV.open('output.txt', 'w', col_sep: '|', row_sep: '[]') do |csv|
     #Do Stuff
end

しかし、Rubyはこのエラーを受け取らずrow_sep: '[]'、スローします。

lib/ruby/1.9.1/csv.rb:2309:in `initialize': empty char-class: /[]\z/ (RegexpError)

/で文字をエスケープしたり、二重引用符を使用したりしようとしましたが、まだ何も機能していません。これを行う方法は何ですか?

4

3 に答える 3

1

問題はCSV#encode_re次のとおりです。パラメータrow_sep: "|[]\n"が正規表現に変換されます。

このメソッドを再定義できるもの:

class CSV
  def encode_re(*chunks)
    encode_str(*chunks)
  end
end
CSV.open('output.txt', 'w', col_sep: '|', row_sep: "|[]\n"
  ) do |csv|
   csv << [1,2,3]
   csv << [4,5,6]
end

結果は次のとおりです。

1|2|3|[]
4|5|6|[]

副作用は見つかりませんでしたが、CSVを再定義するのは快適ではないため、新しいCSVバリアントを作成することをお勧めします。

#Class to create LEDES98
class LEDES_CSV < CSV
  def encode_re(*chunks)
    encode_str(*chunks)
  end
end
LEDES_CSV.open('output.txt', 'w', col_sep: '|', row_sep: "|[]\n"
  ) do |csv|
   csv << [1,2,3]
   csv << [4,5,6]
end

次に、「元の」CSVを使用でき、LEDESファイルの場合はLEDES_CSVを使用できます。

于 2013-01-10T23:21:40.450 に答える
0

次の形式の入力文字列を指定します

s = "[cat][dog][horsey\nhorse]"

あなたは次のようなものを使うことができます

s.scan(/\[(.*?)\]/m).flatten

["cat", "dog", "horsey\nhorse"]これは、CSVモジュールでそれを返し処理します。

于 2013-01-08T15:35:59.080 に答える
0

試してみました

require 'csv'
#Create LEDES98
CSV.open('output.txt', 'w', col_sep: '|', row_sep: '[]') do |csv|
     csv << [1,2,3]
     csv << [4,5,6]
end

そして私は得た

1|2|3[]4|5|6[]

どのcsv/ruby-versionを使用していますか?私CSV::VERSIONは2.4.7、私のルビーバージョンは1.9.2p290(2011-07-09)[i386-mingw32]です。

別の注意: http://www.ledes.org/のサンプルファイルを見ると、追加の改行が必要です。私は使用することをお勧めします:

require 'csv'
#Create LEDES98
CSV.open('output.txt', 'w', col_sep: '|', row_sep: "[]\n") do |csv|
     csv << [1,2,3,nil]
     csv << [4,5,6,nil]
end

結果:

1|2|3|[]
4|5|6|[]

追加のnilsは|、[]の前の最後になります。


ruby 1.9.3p194(2012-04-20)[i386-mingw32]を使用して別のコンピューターでテストしたところ、同じエラーが発生しました。

私は少し調べて、問題を切り分けることができます:

p "[]"      #[]
p "\[\]"    #[]     <--- Problem
p "\\[\\]"  #\\[\\]

をマスクすることはできません[。一度マスクすると、Rubyは[(マスク記号なしで)生成します。2回マスクすると、]ではなく\のみがマスクされます。

于 2013-01-09T09:53:32.393 に答える