Ruby CSV,使用方括号作为行分隔符

时间:2013-01-08 08:05:42

标签: ruby csv fastercsv

我正在尝试使用方括号'[]'作为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,使用双引号等转义字符,但还没有任何工作。有什么办法呢?

3 个答案:

答案 0 :(得分: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。

答案 1 :(得分:0)

给定一个

形式的输入字符串
s = "[cat][dog][horsey\nhorse]"

你可以使用像

这样的东西
s.scan(/\[(.*?)\]/m).flatten

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

答案 2 :(得分: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,我的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|[]

额外的nils为您提供[]之前的最后|


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

我研究了一下,可以解决问题:

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

您无法屏蔽[。如果你屏蔽它一次,Ruby会生成[(没有掩码符号)。如果你将它屏蔽两次,则只屏蔽\,而不是屏蔽它。