【问题标题】:Ruby and writing to CSV - how to avoid a blank line at the end?Ruby 和写入 CSV - 如何避免最后出现空行?
【发布时间】:2012-04-21 12:28:42
【问题描述】:

我正在从 Ruby 生成一个 CSV 文件,而正在接收数据的系统无法接受底部的空行。

但是,在我添加了所有行(以 CRLF 结尾)之后,最后一行仍然有 CFLF,所以接收系统认为有一个空白的 lasy 行。

我通过执行这个(hackish)代码来打开和截断文件来解决它:

  size = File.size(filename)
  File.truncate(filename, size-3)

我是否缺少 ruby​​ CSV 中的某些功能,如果它是最后一行,则不添加 CRLF?

我编写 CSV 的代码是:

  csv = CSV.open(filename, "w", {:row_sep => "\r\n"})
  .. code to create an array of cols ..
  csv << cols

我尝试将其转换为使用字符串,而不是文件。但我没有成功。使用

更新:原来我问错了问题...

已经有一段时间了,但我终于弄清楚发生了什么。我上传的主机系统也可以处理文件末尾的换行符 - Ruby CSV 输入了错误的换行符:\r\r\n instread of \r\n!如果我写为文本文件,它会这样做。如果我写成二进制文件,问题就解决了。

如果其他人看到同样的问题,这是我的 Ruby:

csv = CSV.open(filename, "w", {:row_sep => "\r\n"}) # actually writes \r\r\n 

二进制模式修复它:

csv = CSV.open(filename, "wb", {:row_sep => "\r\n"}) # correctly writes \r\n

【问题讨论】:

  • 在我看来接收系统坏了。
  • 好点。虽然我无法控制.. 但我会针对它提交一个错误,
  • 生成 CSV 的代码是什么?具体来说,您是如何将其写入文件的?

标签: ruby csv


【解决方案1】:

如果您在写入之前将 CSV 作为字符串获取,则可以使用 String#chomp 删除尾随换行符。

如果您正在使用以下方式写入文件:

File.open('my.csv','w'){ |f| f.puts my_csv }

...那么您自己添加换行符,可以通过以下方式避免它:

File.open('my.csv','w'){ |f| f.write my_csv }

如果您提供用于生成和编写 CSV 的实际代码,我们可以进一步、更准确地为您提供帮助。

【讨论】:

    【解决方案2】:

    您可以使用sub! 去除文件末尾的任何换行符:

    # my_csv_contents contains all of the CSV data
    my_csv_contents.sub!(/(\r?\n)*\z/, "")
    

    【讨论】:

    • 变量my_csv_contents是CSV文件的全部内容,而不是单行的内容。 $ 仅匹配此字符串的末尾 - 在本例中是文件末尾,而不是行尾。
    • 试试:"a\n\nb\n".sub /\n$/, "" #=&gt; "a\nb\n";您希望 \z 匹配 Ruby 正则表达式中的字符串结尾。
    • 所以,这段代码真的应该是:my_csv_contents.sub!(/(?:\r?\n)+\z/, "")
    猜你喜欢
    • 1970-01-01
    • 2011-12-12
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    • 2021-03-07
    • 2020-02-24
    • 2017-01-07
    • 2020-04-09
    相关资源
    最近更新 更多