Ruby CSV:如何读取一个制表符分隔的文件?

11
CSV.open(name, "r").each do |row|
  puts row
end

我得到了以下错误:

CSV::MalformedCSVError Unquoted fields do not allow \r or \n 

这个文件的名称是一个 .txt 的制表符分隔文件,我特意制作了它。我有一个 .csv 文件,我打开它在 Excel 中,并将文件保存为 .txt 制表符分隔的格式。所以它是使用制表符分隔的。

CSV.open 不应该可以读取制表符分隔的文件吗?


你遇到了什么样的错误? - Aleksei Matiushkin
CSV::MalformedCSVError:未引用的字段不允许 \r 或 \n。 - someone
1
欢迎来到Stack Overflow。"And I get the error."这句话并没有告诉我们任何信息;具体来说,你遇到了什么错误?文件的名称不能是.txt制表符分隔的文件,但文件内容可以是文本,字段可以是制表符分隔的。CSV打开制表符分隔的("TSV")和逗号分隔的文件("CSV"),但你必须告诉类你正在处理哪一个。当寻求调试帮助时,你需要包括一个最小化的示例输入、演示问题的代码以及问题的明确定义。目前我们没有足够的信息来帮助你。 - the Tin Man
3个回答

17

尝试像这样指定字段分隔符:

CSV.open("name", "r", { :col_sep => "\t" }).each do |row|
  puts row
end

记得要 require 'csv' 并阅读文档

。有关 IT 技术的内容,请确保您理解了所需的程序库和文档。

我做了一个小修改,可能会有所帮助,请尝试一下。 - nextstep
File.open可以工作,但是我该如何从文件中读取内容呢?我尝试使用CSV.read,但它又把我带回了同样的错误。 - someone

4
默认情况下,CSV使用逗号作为分隔符,这是因为CSV代表“逗号分隔值”。如果您想要不同的分隔符(在本例中为制表符),则需要明确指定。 示例:
p CSV.new("aaa\tbbb\tccc\nddd\teee", col_sep: "\t").read

相关文档: http://ruby-doc.org/stdlib-2.1.0/libdoc/csv/rdoc/CSV.html#new

该链接提供了有关Ruby CSV库中的“新建”方法的文档。该方法可用于创建CSV对象,以便读取或写入CSV文件。请参阅文档以获取更多详细信息。

我尝试了以下代码:somefile = CSV.open(name, col_sep: "\t").read puts hello但它并没有起作用,仍然抛出相同的错误。 - someone
我觉得你的文件可能格式不正确。你可以尝试运行这个命令并报告结果:p File.read(name) - Jesus Castello
当我执行puts命令时,它会显示类似于File:0000193841348这样的内容,冒号后面是一些随机数字。 - someone
请问您能否将文件上传到某个地方,以便我们进行测试?我相信这个问题现在很可能是由于文件本身引起的。 - Jesus Castello
@JesusCastello,我得同意,特别是因为他收到了一个CSV :: MalformedCSVError。这清楚地说明问题是文件格式不正确。 - engineersmnky

0
作为替代 CSV 的选择,您也可以像这样使用 smarter_csv
require 'smarter_csv'

data = SmarterCSV.process(filename, col_sep: "\t")

如果您使用的是smarter_csv >= 1.4.2,您也可以这样做:

require 'smarter_csv'

data = SmarterCSV.process(filename, col_sep: :auto)

SmarterCSV将返回一个哈希数组,并且可以进行批处理


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