我的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
或,
的人(不是分隔符)的概率为零。因此,在同一个文件中使用两个不同的分隔符并不是我明确想要阻止的。
答案 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,]/)