1

我的电脑不知道这个字符是什么。它来自 Excel。

在 excel 中它是一个奇怪的空间,现在它由几个符号表示,即。我的电脑不知道它是什么。

这个字符在 Excel 中由 Ê 表示(在 csv 中,因为 xls 它是某种空间),OS X 的 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 没有影响。

我已经尝试按照Remove non-ascii characters from csvsed中的建议使用,但出现了类似的错误

sed:1:“output.csv”:无效的命令代码o

sed -i 's/[\d128-\d255]//' input.csv在 Mac 上运行类似的东西时。

4

4 回答 4

0

**自答(不同账号,同一人)

第一次解决方案尝试:

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',这会将那些(西里尔字母)K 转换为 '\xCA',然后可以使用

string.gsub!(/\xCA/, '')

** 我还没有解决这个问题。

第三次解决方案尝试:

试图匹配 K 的数组,就好像它们是实际的 K 一样是愚蠢的。复制并粘贴实际的西里尔字母 K,看看它是如何工作的——这是字符,注意最后的小卷曲

К

ruby 通过使它比正常的 K 更粗一点来对待它

第 4 次解决方案/策略尝试(成功):

  • 使用正则表达式来捕获字符,只要您可以将奇怪的空格(或任何它们)编码成某种东西,然后您就可以使用正则表达式忽略它们
  • 还尝试利用文档类型中的任何空间(类似矩阵)模式。
于 2012-10-16T02:01:55.397 回答
0

使用以下内容解析您的 csv 以删除您的“邪恶”角色

.encode!("ISO-8859-1", :invalid => :replace)
于 2012-10-16T10:02:59.583 回答
0

这个问题的答案是

A.) 这是一个非常困难的问题。到目前为止,没有人知道如何“物理地”删除西里尔字母 Ks。

B.) csv 文件只是由非转义逗号分隔的字符串,因此只要编码不会破坏程序,使用正则表达式匹配字符串就可以正常工作。

所以要读取文件

f = File.open(File.join(Rails.root, 'lib', 'assets', 'repo', name), :encoding => "windows-1251:utf-8")
parsed = CSV.parse(f)

然后通过正则表达式文字字符串匹配查找特定行(它将忽略西里尔字母 K)

parsed.each do |p|           #here, p[0] is the metatag column
  @specific_metatag_row = parsed.index if p[0] =~ /MetatagA/
end
于 2012-11-02T23:32:58.800 回答
0

我无法开始sed工作,但最终幸运地在 Vim 中做到了这一点:

vim myhorriblefile.csv

# Once vim is open:
:s/Ê/ /g
:wq

# Done!

作为一个通用的重用函数,它可以是:

clean_weird_character () {
  vim "$1" -c ":%s/Ê/ /g" -c "wq"
}
于 2016-02-01T19:39:50.570 回答