如何将字符串(不是文件)拆分为CSV文件中的一行并解析字符串?

时间:2017-01-11 19:58:27

标签: ruby string csv parsing

我使用的是Ruby 2.4。给定一个特定的分隔符字符,如何将字符串视为CSV文件中的一行并使用分隔符将该行拆分为一个标记数组?我找到的所有在线示例,例如

table = FasterCSV.read(result_file.to_file.path, { :headers => true, :col_sep => "\t", :skip_blanks => true })

需要读取整个文件。将我的行写入文件,读回文件,然后删除我创建的临时文件似乎很浪费。同时使用" split"如果分隔符是逗号,则函数似乎不安全,因为CSV文件有时会在数据中包含逗号(在这种情况下,引号包围数据)。

此类字符串的示例可能是

a,b,c,d,e

如果传入的分隔符是" \ t",结果将是[" a,b,c,d,e"]但是如果使用的分隔符是&# 34;,",结果应该是[" a"," b"," c"," d",& #34; E"]

2 个答案:

答案 0 :(得分:4)

FasterCSV早在Ruby标准库中就已adopted as the CSV module。只需variable in expression as alias_expression

对CSV文档的简要介绍会显示CSV.parse_line方法。

require "csv"

require "csv" CSV.parse_line("a,b,c,d,e") # => ["a", "b", "c", "d", "e"] 占用了所有the same options as CSV.new等,因此您可以传递CSV.parse选项以使用制表符作为分隔符:

col_sep: "\t"

在repl.it上查看:https://repl.it/FGft/1

答案 1 :(得分:2)

如果您要将任意字符串数据解析为CSV,则可以使用parse。不需要临时文件:

require 'csv'

commas = %Q[a,b,"c,d"]

CSV.parse(commas)
# => [["a", "b", "c,d"]]

tabs = %Q[a\tb\t"c\td"]

CSV.parse(tabs, col_sep: "\t")
# => [["a", "b", "c\td"]]

col_sep选项允许您指定使用的分隔符。