【问题标题】:Ruby CSV: How can I read a tab-delimited file?Ruby CSV:如何读取制表符分隔的文件?
【发布时间】:2015-10-15 08:24:51
【问题描述】:
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 不应该能够读取制表符分隔的文件吗?

【问题讨论】:

  • 你遇到了什么错误?
  • CSV::MalformedCSVError 未加引号的字段不允许 \r 或 \n
  • 欢迎来到 Stack Overflow。 “我得到了错误。”什么也没告诉我们;具体是 what 你得到了什么错误?文件名不能是 .txt 制表符分隔文件,但文件内容可以是文本,字段可以制表符分隔。 CSV 打开制表符分隔(“TSV”)和逗号分隔文件(“CSV”),但您必须告诉班级您正在处理的是哪一个。在寻求帮助调试时,您需要包含示例输入的最小示例、演示问题的代码以及问题的清晰定义。因为我们没有足够的信息来帮助您。

标签: ruby csv


【解决方案1】:

作为CSV 的替代品,您也可以像这样使用smarter_csv

require 'smarter_csv'

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

你会收到一个哈希数组

【讨论】:

    【解决方案2】:

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

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

    记得require 'csv' 并阅读DOCS

    【讨论】:

    • 我做了一个小修改,可能会有所帮助,试试吧。
    • File.open 有效,但是我如何从文件中读取内容?然后我把 CSV.read 放在那里,但这让我回到了同样的错误。
    【解决方案3】:

    默认情况下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

    【讨论】:

    • 我试过 somefile = CSV.open(name, col_sep: "\t").read puts hello 但它不起作用,它仍然抛出同样的错误。
    • 我认为您的文件可能格式错误。你能试试这个并报告结果吗? p File.read(name)
    • 当我做 puts 时,它会在 <0000193841348>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    • 2015-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多