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)

我试过用 /'s 转义字符,使用双引号等,但没有任何效果。这样做的方法是什么?

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

我刚试过

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 版本?我CSV::VERSION的是 2.4.7,我的 ruby​​ 版本是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|[]

额外的 nil 为您提供|[] 之前的最后一个。


我在另一台使用 ruby​​ 1.9.3p194 (2012-04-20) [i386-mingw32] 的计算机上进行了测试,得到了同样的错误。

我研究了一下,可以隔离问题:

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

你不能屏蔽[. 如果你屏蔽一次,Ruby 会生成[(没有屏蔽符号)。如果你屏蔽它两次,你只屏蔽\,而不是]。

于 2013-01-09T09:53:32.393 回答
0

给定一个表单的输入字符串

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

你可以使用类似的东西

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

它将["cat", "dog", "horsey\nhorse"]使用 CSV 模块返回并处理它。

于 2013-01-08T15:35:59.080 回答