来自CSV文件的字符串开头的神秘前导“空”字符

问题描述 投票:4回答:1

[在将CSV文件读入数组的过程中,我注意到第一个数组元素(它是一个字符串)包含一个前导“”。

例如:

str = contacts[0][0]
p str

给我...

“ SalesRepName”

然后,我碰巧尝试了:

str = contacts[0][0].split(//)
p str

那给了我...

[“”,“ S”,“ a”,“ l”,“ e”,“ s”,“ R”,“ e”,“ p”,“ N”,“ a”,“ m” ,“ e”]

我已经检查了数组中的所有其他元素,这是唯一具有包含前导“”的字符串的元素。

ruby csv byte-order-mark zero-width-space
1个回答
8
投票

现在,在我发布这个问题之前,我偶然发现了答案。显然,我写下问题的举动使我想到了确定此“”字符的ASCII码的想法。

str = contacts[0][0].split(//)
p str[0].codepoints

给我

[65279]

询问ascii字符65279时,我发现了这篇文章:https://stackoverflow.com/a/6784805/3170942

根据SLaks:

这是零宽度的不间断空格。它更常用作 字节顺序标记(BOM)。

反过来,这导致我在这里找到解决方案:https://stackoverflow.com/a/7780559/3170942在此响应中,knut提供了一个优雅的解决方案,看起来像这样:

File.open('file.txt', "r:bom|utf-8"){|file|
  text_without_bom = file.read
}

使用,“ r:bom | utf-8”是我正在寻找的关键元素。因此,我将其适应了我的代码,变成了这样:

CSV.foreach($csv_path + $csv_file, "r:bom|utf-8") do |row|
  contacts << row
end

我花了几个小时解决这个愚蠢的问题。希望这可以节省您一些时间!

© www.soinside.com 2019 - 2024. All rights reserved.