簡體   English   中英

Ruby CSV,使用方括號作為行分隔符

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM