FasterCSV:几个分隔符

时间:2011-10-20 07:10:14

标签: ruby fastercsv

我的Rails3应用程序解析用户上传的CSV文件 可以预料,用户会上传以制表符分隔的AND逗号分隔文件 我想支持两者。

我的代码:

input = CSV.read(uploaded_io.tempfile, { encoding: "UTF-8", :col_sep => "\t"})

问题:如何更改它以支持逗号?

FasterCSV的文档将col_sep描述为The String placed between each field.,因此:col_sep => ",\t"将无效。

注意:里面的所有数据都是整数或标识符,因此在内容中使用\t,的人(不是分隔符)的概率为零。因此,在同一个文件中使用两个不同的分隔符并不是我明确想要阻止的。

3 个答案:

答案 0 :(得分:4)

解决方案1:

一种简单的方法是让用户通过下拉列表选择他们在CSV文件中使用的分隔符,然后在CSV.read()调用中设置该值。但我想你想要它是自动的。 : - )

解决方案2:

您可以使用常规File.read()朗读CSV文件的第一行,并通过将第一行与/,/匹配,然后将/\t/CSV.read()匹配来进行分析...具体取决于哪个RegExp匹配,您在CSV.read(..., :col_sep => single_separator )调用相应(单个)分隔符时选择分隔符。然后,您相应地使用",\t"读取文件。

但要注意:

起初看起来很漂亮,想要在方法调用中使用','作为分隔符来允许两者 - 但是请注意这会引入一个可能讨厌的错误!

如果CVS文件偶然或偶然包含制表符和逗号...那么你做什么? 两者分开?你怎么能确定?我认为这是一个错误,因为CSV分隔符在常规CSV文件中看起来不像这样“混合” - 它始终是"\t"",\t"

所以我认为你不应该使用col_sep - 这可能会导致巨大的问题,这可能是他们没有实现/允许{{1}}选项接受RegExp的原因。

答案 1 :(得分:0)

如果数据不包含转义引号等,只需拆分正则表达式即可。

f = File.new("some_file.csv")
res = f.readlines.map{|line| line.chomp.split(/[\t,]/)}
f.close

答案 2 :(得分:0)

残酷的解决方案:

require 'csv'
csv= CSV.new("some_file")
csv.instance_variable_set(:@col_sep, /[\t,]/)