我使用的是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"]
答案 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
选项允许您指定使用的分隔符。