【发布时间】:2014-08-10 20:29:41
【问题描述】:
我在读取 csv 文件时遇到问题。文件来自 Windows,所以我想有一些编码问题。我的代码如下所示:
CSV.open(path, 'w', headers: :first_row, col_sep: ';', row_sep: "\r\n", encoding: 'utf-8') do |csv|
CSV.parse(open(doc.file.url), headers: :first_row, col_sep: ';', quote_char: "\"", row_sep: "\r\n", encoding: 'utf-8').each_with_index do |line, index|
csv << line.headers if index == 0
# do something wiht row
csv << line
end
end
我必须打开现有文件并从中完成一些列。所以我只是创建新文件。现有文件存储在 Dropbox 上,所以我必须使用 open 方法。
问题是我在这一行得到一个错误:
CSV.parse(open(doc.file.url), headers: :first_row, col_sep: ';', quote_char: "\"", row_sep: "\r\n", encoding: 'utf-8').each_with_index do |line, index|
错误是:
Illegal quoting in line 1. CSV::MalformedCSVError
我检查了一下,似乎文件中没有 BOM 字符(不确定检查是否正确)。问题似乎出在引号字符中。文件中的每一行都会引发异常。
这是给我带来问题的文件:https://dl.dropboxusercontent.com/u/3900955/geo_bez_adresu_10_do_testow_small.csv
我尝试了 StackOverflow 的不同方法,但没有任何帮助,例如我将代码更改为:
CSV.open(path, 'w', headers: :first_row, col_sep: ';', row_sep: "\r\n", encoding: 'utf-8') do |csv|
open(doc.file.url) do |f|
f.each_line do |line|
CSV.parse(line, 'r:bom|utf-8') do |row|
csv << row
end
end
end
end
但这无济于事。对于解析此文件的任何帮助,我将不胜感激。
=======编辑=========
当我在 Windows 上使用 ANSI 编码为 UTF-8(在 Notepad++ 中)保护同一个文件时,我可以正确解析文件。从这个讨论What is "ANSI as UTF-8" and how can I make fputcsv() generate UTF-8 w/BOM?,看来我在原始文件中有BOM。如果我的文件带有 BOM,我如何签入 Ruby,以及如何使用 BOM 解析 csv 文件?
【问题讨论】:
-
您使用的是旧版本的 ruby 吗?
-
不,我使用的是 Ruby 2.1.2p95。