[英]Ruby CSV, using square brackets as row separators
我正在嘗試使用方括號'[]'作為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)
我試過使用雙引號等來逃避字符,但是還沒有任何工作。 這樣做的方法是什么?
問題出在CSV#encode_re
:參數row_sep: "|[]\\n"
轉換為Regexp。
什么可以重新定義這種方法:
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。
給定表單的輸入字符串
s = "[cat][dog][horsey\nhorse]"
你可以用類似的東西
s.scan(/\[(.*?)\]/m).flatten
它將返回["cat", "dog", "horsey\\nhorse"]
並使用CSV模塊處理。
我剛試過
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會產生[
(沒有掩碼符號)。 如果你屏蔽它兩次,你只屏蔽\\,而不是]。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.