4

我的 Rails3 应用程序解析用户上传的 CSV 文件。
正如所料,用户上传制表符分隔和逗号分隔的文件。
我想支持两者。

我的代码:

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

4

3 回答 3

4

解决方案1:

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

解决方案2:

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

但请注意:

起初,希望",\t"在方法调用中用作分隔符以允许两者兼而有之,这看起来既漂亮又优雅——但请注意,这可能会引入一个令人讨厌的错误!

如果 CVS 文件偶然或偶然同时包含制表符和逗号……那你会怎么做?两者分开?你怎么能确定?我认为这将是一个错误,因为 CSV 分隔符在常规 CSV 文件中不会像这样“混合”出现——它总是','要么"\t"

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

于 2011-10-20T07:18:20.973 回答
0

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

f = File.new("some_file.csv")
res = f.readlines.map{|line| line.chomp.split(/[\t,]/)}
f.close
于 2011-10-20T09:00:42.407 回答
0

残酷的解决方案:

require 'csv'
csv= CSV.new("some_file")
csv.instance_variable_set(:@col_sep, /[\t,]/)
于 2011-10-20T10:10:53.340 回答