我正在使用SuperCSV检查接收到的某些文件的内容。文件的格式是这样的:它有一个头记录,后面是数据记录,后面是一个CRC32校验和值。
例如:
ABC|2|20130115150327|
1|1234567890123456|1234|20130109204710|21130109204710|
2|6543210987654321|1234|20130110043658|21130110043658|
1A345C7D关于SuperCSV在这种情况下的能力,我有几个问题。
发布于 2013-01-15 03:12:25
是。通常,使用不使用getHeader()的CellProcessors读取标头,但是没有什么可以阻止您将标题作为普通行来读取,而read()使用CellProcessors。每次对read()的调用都允许您传递CellProcessors,因此您可以使用3个不同的CellProcessor数组处理/验证头、数据行和校验和。
在使用|作为分隔符时,最后一列将被视为空列(null)。这意味着用于读取标头的CellProcessor数组必须有4个元素(或6个用于数据行),否则将得到一个异常,即列数与单元处理器的数量不匹配。通过在最后放置一个new Equals(null)处理器,您可以从本质上验证该行是否以一个|结尾。
可以使用现有的单元处理器new StrRegex("[0-9A-F]+")使用正则表达式进行验证。您甚至可以使用StrRegex.registerMessage()为验证错误(例如,“非有效十六进制值”)注册一条人类可读的消息。
如果您想将十六进制解析为一个数字(可能不是,但只是以防万一),那么Super中就没有存在的ParseHex CellProcessor。如果你写一个并提交一个补丁,我将把它包括在即将发布的版本中!取决于数字的大小,也许最好更新ParseLong,使其具有另一个接受基的构造函数(本例中为16)?
我建议保持简单,并使用CsvListReader (您可以使用其他读取器,但您需要定义一个nameMapping数组来为标题、数据和校验行提供列名)如下:
ParseChecksum())读取校验和。https://stackoverflow.com/questions/14328668
复制相似问题