Ruby和写入CSV - 如何避免在结尾处出现空行?

5

我正在使用Ruby生成一个CSV文件,但接收数据的系统不能接受底部的空行。

然而,在我添加所有以CRLF结尾的行后,最后一行仍然有CFLF,因此接收系统认为有一个空白的最后一行。

我通过使用以下(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 而不是 \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

2
在我看来,接收系统出了问题。 - Arkku
好的观点。虽然这不在我的控制范围内,但我会针对此问题提交错误报告。 - peterept
1
你的生成CSV文件的代码是什么?具体来说,你是怎么将它写入文件的? - Phrogz
2个回答

3

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

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

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

如果您自己添加了换行符,则可以使用以下方法避免:

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

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

0

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

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

变量my_csv_contents是CSV文件的全部内容,而不是单行的内容。$仅匹配字符串的结尾 - 在这种情况下是文件的结尾,而不是行的结尾。 - robbrit
1
尝试使用以下代码:"a\n\nb\n".sub /\n$/, "" #=> "a\nb\n";在Ruby正则表达式中,您需要\z来匹配字符串末尾。 - Phrogz
所以,这段代码实际上应该是这样写的:my_csv_contents.sub!(/(?:\r?\n)+\z/, "") - Phrogz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接