我有一个日期导入项目,客户端在其中发送ANSI-latin1编码文件(iso-8859-1)。但是......似乎每周我们得到一个惊喜文件,一个格式不正确,导入基本上死得很可怕,需要手动干预才能恢复并继续...最常见的坏文件格式似乎是excel,压缩文件或XML / HTML文件......
因此,为了减轻人为干预,我想合理地确定我们是否有一个强大的ANSI候选文件,然后尝试浏览文件的每一行,查找64个坏字符中的1个然后进行猜测发现的坏字符数是否整行或文件都不好......
我在考虑可能会进行Unicode / UTF检查和/或幻数检查,或者晚上尝试检查一些特定的应用程序类型。这些文件没有文件扩展名,所以任何检查都是通过检查内容和任何快速排除文件为非ANSI的方法是完美的,因为导入过程需要每秒处理100-500条记录。
注意:已向我们发送了100多种不同类型的错误文件,包括图像和PDF文件。因此,您是否可以轻松快速地排除不同非ANSI类型的LTOS,而不是专门针对少数几个......
答案 0 :(得分:5)
鉴于您的示例“坏”文件类型,我会说对文件的前几个字节进行一系列快速检查:
<html
”还是“<!DOCTYPE
”?<xml
”吗?答案 1 :(得分:2)
我喜欢RichieHindle的答案非常好。您还应该查看导入中的错误处理。如果您遇到错误的文件捕获错误,请记录并继续。您不应该停止导入其他文件,或者因为一个文件中的一个错误导致其他客户的导入更糟糕......如果有办法通过电子邮件等通知客户该文件无法导入您可能不会必须做尽可能多的人工干预。
答案 2 :(得分:1)
在Unix类型的系统上,您可以使用“file”命令。我想知道Windows中是否有“文件”端口?我在谷歌找不到一个,但我敢打赌它可以在GNU.org上找到...
如果你碰巧有一堆典型的“坏”文件,建立一个文件签名数据库就好了,类似于“文件”所使用的。
答案 3 :(得分:1)
查看前几个字节是一个好主意,但有时它可能导致错误的结论。
我记得制作了一个CSV文件,用于将值插入MySQL数据库,但我先用Excel打开它,检查一切是否正常。
Excel立即说“这是一个SYLK文件,你确定你知道你在做什么吗?”
我以前从未听过的SYLK文件,但维基百科告诉我这是一个带有标题的CSV文件,其中第一个字符是'ID'。
这可能与你正在做的事情没有任何关系,但我想我会指出魔术数字并不像它们可能那样神奇。
答案 4 :(得分:0)
您可以将开头读入StreamReader,然后调用CurrentEncoding属性。
http://msdn.microsoft.com/en-us/library/system.io.streamreader.currentencoding.aspx
请注意,100%可靠地检测编码在理论上是不可能的。但是,CurrentEncoding属性会通过最好的一般启发式算法来进行猜测。