【问题标题】:Ruby CSV::Row remove new lineRuby CSV::Row 删除新行
【发布时间】:2014-03-06 02:19:08
【问题描述】:

我正在打开一个 CSV 文件,然后将其转换为 JSON。除了 JSON 数据在字符串中有 \n 字符外,这一切都很好。据我从打印它并试图咀嚼它可以看出,这些不是最后一个元素的一部分。当我打印 row 它确实有 \n

require 'csv'
require 'json'
def csv_to_json (tmpfile)
    JSON_ARRAY = Array.new
    CSV.foreach(tmpfile) do |row|
        print row[row.length - 1]
        if row[row.length - 1].chomp! == nil
            print row
        end
        JSON_ARRAY.push(row)
     end
     return JSON_ARRAY.to_json
 end

返回的 JSON 如下所示

["field11,field12\n",
 "field21,field22\n"]

如何删除这些换行符?

编辑: 这些是CSV::Row 对象,不支持chompstrip 等字符串操作

tmpfile 的格式是

field11,field21
field21,field22

【问题讨论】:

  • 你能做一个最小的独立的正确例子吗?我们不知道tmpfile 是什么样子,我们不知道JSON_ARRAY 会发生什么,据我所知,CSV::Row#to_s 将导致["a", "b", "c"],而不是a,b,c\n。除非你在某处使用CSV::Row#to_csv,我看不到,否则我不知道你是如何得到这个结果的。
  • @Amadan 我添加了更多细节,例如文件格式。同样来自CSV::Row 的rdoc,它说to_sAlias for: to_csv
  • 我自己试过了,但我没有看到与您相同的行为。当我打印行中的最后一个字段时,其中没有换行符。
  • 您是在 Windows 上运行它吗? CSV 库文档表明,如果文件未在 Windows 上以二进制模式打开,则可能会有些古怪。
  • @SomeGuy 我打印最后一个字段时也看不到它。我在 OSX 10.9 Ruby 2.1.1 上这样做

标签: ruby csv


【解决方案1】:

row_sep 设置为nil

JSON_ARRAY.push( row.to_s( row_sep: nil ) )

JSON_ARRAY.push( row.to_csv( row_sep: nil ) )

正如评论所指出的,CSV::row#to_sCSV::row#to_csv 的别名,它会自动在每行之后添加一个行分隔符。要解决此问题,您只需将row_sep 设置为nil,它不会在每行末尾添加\n

希望对您有所帮助。

【讨论】:

    【解决方案2】:

    最简单的方法:

    File.read(tmpfile).split("\n")
    

    顺便说一句,如果你想从字符串中删除换行符,你可以使用String::strip 方法。

    CSV.foreach(tmpfile) do |row|
      # here row should be an array.
      p row
    end
    

    【讨论】:

    • 我没有在新行上拆分文件的问题,但从CSV::Row 中删除\n
    • 这不能回答问题。
    【解决方案3】:
    CSV.foreach(tmpfile) do |row|
        print row[row.length - 1]
        if row[row.length - 1].chomp! == nil
            print row
        end
        row.map{|cell| cell.strip!}
        JSON_ARRAY.push(row)
     end
    

    行不支持剥离,但单元格支持。

    【讨论】:

    • 这些是CSV::Row,不支持像strip这样的字符串操作
    【解决方案4】:

    事后我能够使用map! 让它工作

    json_array.map! { |row| row = row.to_s.chomp! }
    

    您也可以在循环内执行to_s.chomp!。这对我来说不是一个选择,因为我需要常规对象在返回 json 之前进行一些计算

    【讨论】:

    • 您不需要在数组和单个字符串上都使用 bang。任何一个都可以工作json_array.map! { |row| row = row.to_s.chomp } 将创建新字符串并指向这些新字符串的数组引用。而json_array.map { |row| row = row.to_s.chomp! } 会自己修改数组元素。
    猜你喜欢
    • 2017-07-05
    • 2014-12-29
    • 1970-01-01
    • 1970-01-01
    • 2018-08-15
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    • 1970-01-01
    相关资源
    最近更新 更多