【问题标题】:Ruby CSV, using square brackets as row separatorsRuby CSV,使用方括号作为行分隔符
【发布时间】:2012-12-22 01:12:28
【问题描述】:

我正在尝试使用方括号“[]”作为 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 转义字符,使用双引号等,但没有任何效果。这样做的方法是什么?

【问题讨论】:

  • 我不认为你可以用 CSV 类来做到这一点。您可能需要进行两部分处理。首先,使用col_sep 而不是row_sep。然后用[ ... ] 包裹每一行来重写每一行。
  • 您可以添加数据样本吗?

标签: ruby csv fastercsv


【解决方案1】:

问题出在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。

【讨论】:

    【解决方案2】:

    我刚试过

    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 会生成[(没有屏蔽符号)。如果你屏蔽它两次,你只屏蔽\,而不是]。

    【讨论】:

    • Ruby 版本 1.9.3p194(2012-04-20 修订版 35410)[x86_64-darwin11.4.0]
    • 我在另一台计算机上使用 ruby 1.9.3p194 (2012-04-20) [i386-mingw32] 进行了测试 - 现在我遇到了同样的错误。
    • 我找到了一个使用更新的 ruby​​ 版本的解决方案。见我的other answer
    【解决方案3】:

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

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

    你可以使用类似的东西

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

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

    【讨论】:

      猜你喜欢
      • 2019-07-18
      • 2014-08-14
      • 2020-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-12
      • 2012-09-16
      • 1970-01-01
      相关资源
      最近更新 更多