Ruby 无法解析 CSV 文件:CSV::MalformedCSVError(第 1 行中的非法引用。)

2024-03-12

Ubuntu 12.04 LTS

Ruby ruby​​ 1.9.3dev(2011-09-23 修订版 33323)[i686-linux]

轨道 3.2.9

以下是我收到的 CSV 文件的内容:

"date/time","settlement id","type","order id","sku","description","quantity","marketplace","fulfillment","order city","order state","order postal","product sales","shipping credits","gift wrap credits","promotional rebates","sales tax collected","selling fees","fba fees","other transaction fees","other","total"
"Mar 1, 2013 12:03:54 AM PST","5481545091","Order","108-0938567-7009852","ALS2GL36LED","Solar Two Directional 36 Bright White LED Security Flood Light with Motion Activated Sensor","1","amazon.com","Amazon","Pasadena","CA","91104-1056","43.00","3.25","0","-3.25","0","-6.45","-3.75","0","0","32.80"

但是,当我尝试解析 CSV 文件时,出现错误:

1.9.3dev :016 > options = { col_sep: ",", quote_char:'"' }
=> {:col_sep=>",", :quote_char=>"\""} 

1.9.3dev :022 > CSV.foreach("/tmp/my_data.csv", options) { |row| puts row }
CSV::MalformedCSVError: Illegal quoting in line 1.
    from /home/jigneshgohel/.rvm/rubies/ruby-1.9.3-rc1/lib/ruby/1.9.1/csv.rb:1925:in `block (2 levels) in shift'
    from /home/jigneshgohel/.rvm/rubies/ruby-1.9.3-rc1/lib/ruby/1.9.1/csv.rb:1887:in `each'
    from /home/jigneshgohel/.rvm/rubies/ruby-1.9.3-rc1/lib/ruby/1.9.1/csv.rb:1887:in `block in shift'
    from /home/jigneshgohel/.rvm/rubies/ruby-1.9.3-rc1/lib/ruby/1.9.1/csv.rb:1849:in `loop'
    from /home/jigneshgohel/.rvm/rubies/ruby-1.9.3-rc1/lib/ruby/1.9.1/csv.rb:1849:in `shift'
    from /home/jigneshgohel/.rvm/rubies/ruby-1.9.3-rc1/lib/ruby/1.9.1/csv.rb:1791:in `each'
    from /home/jigneshgohel/.rvm/rubies/ruby-1.9.3-rc1/lib/ruby/1.9.1/csv.rb:1208:in `block in foreach'
    from /home/jigneshgohel/.rvm/rubies/ruby-1.9.3-rc1/lib/ruby/1.9.1/csv.rb:1354:in `open'
    from /home/jigneshgohel/.rvm/rubies/ruby-1.9.3-rc1/lib/ruby/1.9.1/csv.rb:1207:in `foreach'
    from (irb):22
    from /home/jigneshgohel/.rvm/rubies/ruby-1.9.3-rc1/bin/irb:16:in `<main>'

然后我尝试简化数据,即

"name","age","email"
"jignesh","30","[email protected] /cdn-cgi/l/email-protection"

但是我仍然遇到同样的错误:

      1.9.3dev :023 > CSV.foreach("/tmp/my_data.csv", options) { |row| puts row }
  CSV::MalformedCSVError: Illegal quoting in line 1.
      from /home/jigneshgohel/.rvm/rubies/ruby-1.9.3-rc1/lib/ruby/1.9.1/csv.rb:1925:in `block (2 levels) in shift'
      from /home/jigneshgohel/.rvm/rubies/ruby-1.9.3-rc1/lib/ruby/1.9.1/csv.rb:1887:in `each'
      from /home/jigneshgohel/.rvm/rubies/ruby-1.9.3-rc1/lib/ruby/1.9.1/csv.rb:1887:in `block in shift'
      from /home/jigneshgohel/.rvm/rubies/ruby-1.9.3-rc1/lib/ruby/1.9.1/csv.rb:1849:in `loop'
      from /home/jigneshgohel/.rvm/rubies/ruby-1.9.3-rc1/lib/ruby/1.9.1/csv.rb:1849:in `shift'
      from /home/jigneshgohel/.rvm/rubies/ruby-1.9.3-rc1/lib/ruby/1.9.1/csv.rb:1791:in `each'
      from /home/jigneshgohel/.rvm/rubies/ruby-1.9.3-rc1/lib/ruby/1.9.1/csv.rb:1208:in `block in foreach'
      from /home/jigneshgohel/.rvm/rubies/ruby-1.9.3-rc1/lib/ruby/1.9.1/csv.rb:1354:in `open'
      from /home/jigneshgohel/.rvm/rubies/ruby-1.9.3-rc1/lib/ruby/1.9.1/csv.rb:1207:in `foreach'
      from (irb):23
      from /home/jigneshgohel/.rvm/rubies/ruby-1.9.3-rc1/bin/irb:16:in `<main>'

我再次尝试像这样简化数据:

name,age,email
jignesh,30,[email protected] /cdn-cgi/l/email-protection

它有效。请参阅下面的输出:

  1.9.3dev :024 > CSV.foreach("/tmp/my_data.csv") { |row| puts row }
  name
  age
  email
  jignesh
  30
  [email protected] /cdn-cgi/l/email-protection
   => nil 

但我将收到包含引用数据的 CSV 文件,因此删除引号解决方案实际上并不是我正在寻找的。我无法弄清楚导致错误的原因:CSV::MalformedCSVError:第 1 行中存在非法引用。在我之前的例子中。

我已经通过在文本编辑器中启用“显示空白字符”和“显示行结尾”来验证 CSV 中没有前导/尾随空格。此外,我还使用以下方法验证了编码。

  1.9.3dev :026 > File.open("/tmp/my_data.csv").read.encoding
  => #<Encoding:UTF-8> 

注意:我也尝试使用 CSV.read 但该方法出现同样的错误。

有人可以帮助我摆脱这个问题并让我明白哪里出了问题吗?

=====================

我刚刚在以下位置找到了以下帖子:http://www.ruby-forum.com/topic/448070 http://www.ruby-forum.com/topic/448070并尝试了以下操作:

  file_data = file.read
  file_data.gsub!('"', "'")
  arr_of_arrs = CSV.parse(file_data)

  arr_of_arrs.each do |arr|
    Rails.logger.debug "=======#{arr}"
  end

并得到以下输出:

   =======["\xEF\xBB\xBF'date/time'", "'settlement id'", "'type'", "'order id'", "'sku'", "'description'", "'quantity'", "'marketplace'", "'fulfillment'", "'order city'", "'order state'", "'order postal'", "'product sales'", "'shipping credits'", "'gift wrap credits'", "'promotional rebates'", "'sales tax collected'", "'selling fees'", "'fba fees'", "'other transaction fees'", "'other'", "'total'"]
    =======["'Mar 1", " 2013 12:03:54 AM PST'", "'5481545091'", "'Order'", "'108-0938567-7009852'", "'ALS2GL36LED'", "'Solar Two Directional 36 Bright White LED Security Flood Light with Motion Activated Sensor'", "'1'", "'amazon.com'", "'Amazon'", "'Pasadena'", "'CA'", "'91104-1056'", "'43.00'", "'3.25'", "'0'", "'-3.25'", "'0'", "'-6.45'", "'-3.75'", "'0'", "'0'", "'32.80'"]

默认情况下,这会导致正确读取数据col_sep使用的是逗号字符。 不过我尝试使用引用字符像这样的选项:

  arr_of_arrs = CSV.parse(file_data, :quote_char => "'")

但最终出现以下错误:

   CSV::MalformedCSVError (Illegal quoting in line 1.):

谢谢, 吉涅什


quote_chars = %w(" | ~ ^ & *)
begin
  @report = CSV.read(csv_file, headers: :first_row, quote_char: quote_chars.shift)
rescue CSV::MalformedCSVError
  quote_chars.empty? ? raise : retry 
end

它并不完美,但大多数时候都有效。

N.B. CSV.parse采用相同的参数CSV.read,因此可以使用文件或内存中的数据

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ruby 无法解析 CSV 文件:CSV::MalformedCSVError(第 1 行中的非法引用。) 的相关文章

  • 当放入对象方法内时,引用拉入封装方法的方法会移出范围

    当我将引用拉入包的方法放入另一个方法中时 它会离开范围并失败 执行此操作的正确方法是什么 我尝试玩弄 自我 但我是新人 但没有成功 所需的解决方案 不起作用 返回错误 nil NilClass 的未定义方法 accounts NoMetho
  • java中的csv到pdf文件

    我正在尝试获得一个csv文件解析为pdf 到目前为止我所拥有的内容附在下面 我的问题是这段代码最终出现在 pdf 中的文件在 csv 文件的第一行被截断 我不明白为什么 附示例 本质上我想要一个没有任何操作的 csv 文件的 pdf 版本
  • 这个结果背后的逻辑是什么?

    def foo override end p foo bye bye p foo hello world Output override hello 我可以理解如果结果是 override world or even bye bye hel
  • ruby 包含问题

    class Foo def initialize a puts Hello a end end module Bar def initialize b puts b World end end class Sample lt Foo inc
  • 在 Bash 中拆分 csv 文件中的列

    我想从 csv 文件的第二列中提取值并将提取的值存储在新列中 我的数据集示例 page name post id page id A 86680728811 272953252761568 86680728811 A 86680728811
  • CanCan load_and_authorize_resource 触发禁止属性

    我有一个使用强参数的标准 RESTful 控制器 class UsersController lt ApplicationController respond to html js def index users User all end
  • 将数组值导出到 csv 文件 java

    我只需要帮助将数组元素导出到 csv 文件 我不知道我的代码有什么问题 任何帮助将不胜感激 谢谢 for int index 0 index lt cols length index FileWriter fw new FileWriter
  • 如何制作可选的强参数键但过滤嵌套参数?

    我的控制器中有这个 params require item permit 让我们假设这个 rspec 规范 它按预期工作 put update id item id item name new name 然而 以下原因ActionContr
  • 如何在 Rails 应用程序中删除 URL 的尾部斜杠? (在 SEO 视图中)

    为了避免内容重复 我希望避免通过多个 URL 带或不带尾部斜杠 访问我的网站页面 目前 URL catalog product 1 and catalog product 1 导致同一页面 我的目标是将第二个 URL 重定向到第一个 当然是
  • 在 Windows 中安装 RubyGems

    我是红宝石新手 我尝试按照网站中给出的步骤在我的电脑上安装 Ruby Gemshttp rubygems org pages download http rubygems org pages download 我从上述站点下载了软件包 将目
  • 将 csv 文件按多列拆分为 panda 数据框

    我有一个包含多列的 tsv 文件 有 10 多列 但对我来说重要的列是名称为 user name shift id url id 的列 我想创建一个数据框 首先根据用户名分隔整个 csv 文件 即只有具有相同用户名的行才会分组在一起 从该块
  • ActiveSupport::JSON 解码哈希丢失符号

    我正在尝试序列化和反序列化哈希 当散列被解除序列化时 密钥被解除符号化 例如不是更多 一 而是 一 从 Rails 控制台 gt gt h one gt 1 two gt two one gt 1 two gt two gt gt j Ac
  • 处理不兼容的字符编码:UTF-8 和 ASCII-8BIT

    我在生产中遇到不兼容的字符编码错误 我尝试在本地重现它 但没有成功 这是错误消息 A ActionView Template Error occurred in controller name action name incompatibl
  • 在 Ruby 文档中哪里可以找到字符串转义序列?

    我可以在 中找到有关 Ruby 转义序列的详细信息 红宝石弦 http www tutorialspoint com ruby ruby strings htm and 转义序列 http en wikibooks org wiki Rub
  • 计算列表中每个项目在 pandas 数据框列中出现的次数,并用逗号分隔值

    我有一个清单 citylist New York San Francisco Los Angeles Chicago Miami 和带有这些值的 pandas Dataframe df1 first last city email John
  • 如何静默启动Sinatra + Thin?

    我有一个 Sinatra Base webservice 我想从命令行 Ruby 程序启动它 所以我有这个 command line program file require mymodule server puts Running on
  • 如何使用Shiny中的下载按钮?

    我想下载一个csv使用 Shiny 中的下载按钮下载文件 该文件将使用辅助 r 脚本中的参数创建 SERVER output downloadData lt downloadHandler filename function paste d
  • Pandas Dataframe.to_csv 小数=',' 不起作用

    在 Python 中 我正在将 Pandas Dataframe 写入 csv 文件 并希望将小数分隔符更改为逗号 像这样 results to csv D Data Kaeashi BigData ProcessMining Voorbe
  • RSpec 与 Shoulda?

    我是单元测试场景的新手 我现在只使用单元测试大约两个月了 当我在 Ruby 中进行单元测试时 我目前遵循 TDD 风格并使用 Test Unit TestCase 我还阅读了 RSpec 以及它如何遵循 BDD 方法 我还读过关于 Shou
  • 正则表达式匹配组,但组成员除外

    因此 有许多正则表达式可以匹配特定的组 如下所示 Any character except a newline m Any character the m modifier enables multiline mode w A word c

随机推荐