我的电脑不知道这个字符是什么。它来自Excel。
在excel中,这是一个奇怪的空间,现在它实际上由几个符号表示,即我的计算机不知道它是什么。
这个字符在Excel中用一个未指定的字符表示(在csv中,作为xls,它是某种空间),OSX的TextEdit将其视为一个这么长的"的大空间,我认为这就是它的本质。Ruby的csv解析器在试图使用普通utf-8解析它时会爆炸,我必须添加:encoding => "windows-1251:utf-8"
来解析它,在这种情况下,Ruby会将它变成一个"K"。该K出现在我的CSV中的9、12、15和18组(KKKKKKKKK等)中,并且不能通过gsub(/K/)
删除(K、/KKKKKKKK/等组也不能删除)!我也使用过开源工具CSVfix,但它的"删除前导和尾随空格"命令对Ks没有影响。
我已经尝试过按照从csv中删除非ascii字符的建议使用sed
,但出现了类似的错误
sed:1:"output.csv":的无效命令代码
在Mac上运行类似sed -i 's/[d128-d255]//' input.csv
的程序时。
用以下内容分析csv以删除"邪恶"字符
.encode!("ISO-8859-1", :invalid => :replace)
**自我回答(不同账户,同一个人)
第一次解决方案尝试:
evil_string_from_csv_cell = "KKKKKKKKK"
encoding_opts = {
:invalid => :replace, :undef => :replace,
:replace => '', :universal_newline => true }
evil_string_from_csv_cell.encode Encoding.find('ASCII'), encoding_opts
#=> ""
第二次解决方案尝试:
不要使用"windows-1251:utf-8"进行编码,而是使用"iso-8859-1",这将把那些(cyrillic)K变成"\xCA",然后可以用删除
string.gsub!(/xCA/, '')
**我还没有解决这个问题。
第三次解决方案尝试:
试图把K的数组当作真正的K来匹配是愚蠢的。复制并粘贴实际的cyrillic K,看看它是如何工作的——这是字符,注意末端的小卷曲
К
ruby通过使其比普通K的更大胆来处理它
第四次解决方案/战略尝试(成功):
- 使用正则表达式来捕捉字符,只要你能将奇怪的空间(或它们是什么)编码成某种东西,你就可以使用正则表达式忽略它们
- 还试图利用文档类型之间的任何空间(类似矩阵)模式
这个问题的答案是
A.)这是一个非常困难的问题。到目前为止,没有人知道如何"物理地"移除cyrillic Ks。
但是
B.)csv文件只是用未加空格的逗号分隔的字符串,所以只要编码不破坏程序,使用正则表达式匹配字符串就可以了。
所以要读取文件
f = File.open(File.join(Rails.root, 'lib', 'assets', 'repo', name), :encoding => "windows-1251:utf-8")
parsed = CSV.parse(f)
然后通过正则表达式文字字符串匹配找到特定的行(它将忽略cyrillic K)
parsed.each do |p| #here, p[0] is the metatag column
@specific_metatag_row = parsed.index if p[0] =~ /MetatagA/
end
我无法使sed
工作,但最终幸运地在Vim:中做到了这一点
vim myhorriblefile.csv
# Once vim is open:
:s/Ê/ /g
:wq
# Done!
作为一个可重用的通用函数,它可以是:
clean_weird_character () {
vim "$1" -c ":%s/Ê/ /g" -c "wq"
}