2017-03-09 31 views
0

我有一个带有47001行的CSV文档。但是,当我在Excel中打开它时,只有31641行。在文本文档中查找各种字符

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

因此,Excel的解析失败。我怀疑这个文档中有某些时髦的控件或空白字符。

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

例如,考虑以下输入文件:ABCAAAaaa\n
我期望文件中使用的字符的字母表是:ABCa\n

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

我怀疑它会比较UTF-8字符与ASCII字符的变化。例如:Excel可能会解析ASCII中的多字节字符,并将一些字节解释为控制码点。

+2

以与输入相同的CSV格式再次导出Excel表格。使用diff比较结果与原始值。您可能首先要发送两个版本:'sed's/[^ a-zA-Z0-9 _] * // g''这会删除所有非字母数字字符,因此略有不同的格式无关紧要。 – Alfe

+0

你知道如何编码你的'csv'吗? UTF8? ASCII? ISO-8859-1? UTF16等? – jm666

+0

@Alfe不幸的是,Excel的CSV输出已经重新格式化了每个日期和每个金额,所以差异将每一行视为已经改变。然而,这sed给了我一个想法。我能够删除所有字母数字字符(加上我期望在日期或UUID中找到的其他字符):'sed's/[a-zA-Z0-9 _ \ - \:,\。 - \“] * // g' Birchlabs

回答

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 

排序后:

的uniq后
a 
a 
a 
A 
A 
A 
A 
B 
C 

然后:

A 
B 
C 
a 

最终输出:

aABC 
+0

这是如何回答这个问题的:__ How do you like this?我可以找出一些文件中使用的各种字符吗?__ – jm666

+0

那么,这将列出文件中使用的所有不同的字符,但也许我误解了这个问题:x – kaldoran

+2

当然,它可以打印ascii '。但是,如果输入是utf8编码,可能还有许多其他的“控制字符”(比如'\ r'),比在这里可能会出现“组合标记”等等,但是可以 - 作为起始解决方案... – jm666

1

可以削减原厂出来l通过传递被解析和写出的循环来记录一些不可能被改变的列, 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的工具也可以得心应手地分析差异。

这将告诉你哪些行经历了→parse→dump周期的变化。希望它只会影响你正在寻找的路线。