不顾一切地试图从ruby中的csv中删除这个恶魔般的excel生成的特殊字符



我的电脑不知道这个字符是什么。它来自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"
}

最新更新