我正在尝试使用方括号'[]'作为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,使用双引号等转义字符,但还没有任何工作。有什么办法呢?
答案 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会生成[
(没有掩码符号)。如果你将它屏蔽两次,则只屏蔽\,而不是屏蔽它。