在文本文档

时间:2017-03-09 12:55:53

标签: bash algorithm non-ascii-characters

我有一个包含47001行的CSV文档。然而,当我在Excel中打开它时,只有31641行。

我知道47001是正确的行数;它是数据库表的导出,我知道它的大小为47001.另外:wc -l my.csv返回47001。

因此,Excel的解析失败了。我怀疑本文档中某处有一些时髦的控件或空格字符。

如何找出某些文档中使用的各种字符?

例如,请考虑此输入文件:ABCAAAaaa\n 我希望文件中使用的字符字母为:ABCa\n

也许如果我们压缩它,我们可以以某种方式阅读Huffman Tree

我怀疑比较UTF-8字符种类与ASCII字符种类是有教育意义的。例如:Excel可以解析ASCII中的多字节字符,从而将某些字节解释为控制代码点。

2 个答案:

答案 0 :(得分:1)

如果你在Linux上,那么我们就去了(背后的逻辑对于所有人来说都是一样的,但对于linux我给出了命令):

sed 's/./&\n/g' | sort -u | tr -d '\n'

发生了什么:     - 首先逐字母替换所有字母,然后按" \ n" [新队]     - 然后对所有特征进行排序并打印uniq事件     - 删除所有" \ n"

然后是输入文件:

ABCAAAaaa

将成为:

A
B
C
A
A
A
a
a
a

排序后:

a
a
a 
A
A
A
A
B
C

然后在uniq:

之后
A
B
C
a

最终输出:

aABC

答案 1 :(得分:1)

你可以通过传递被解析和再次写出的循环来删除原始文件中不太可能改变的一些列,例如: G。纯文本列,如名称或数字。名字会很棒。然后让这个文件通过循环并将其与原始文件进行比较:

以下是代码:

cut -d, -f3,6,8 > columns.csv

这假设第3列,第6列和第8列是名称列,逗号是分隔符。根据您的输入文件调整这些值。使用单列也没关系。

现在调用Excel,解析文件columns.csv,将其再次写为csv文件columns2.csv(当然使用相同的分隔符)。然后:

diff columns.csv columns2.csv | less

meld而不是diff这样的工具也可以方便地分析差异。

这将显示→解析→转储周期中哪些行经历了更改。希望它只影响你正在寻找的线。