我正在使用SuperCSV来检查我收到的某些文件的内容。该文件的格式是这样的,它有一个标题记录,后跟数据记录,后跟CRC32校验和值。
e.g。
ABC|2|20130115150327|
1|1234567890123456|1234|20130109204710|21130109204710|
2|6543210987654321|1234|20130110043658|21130110043658|
1A345C7D
在这种情况下,我对SuperCSV的功能有几个问题。
答案 0 :(得分:5)
- 是否允许您针对不同的行验证不同的行 定义,即一个用于标题记录,一个用于数据 记录?
是。通常情况下,您会使用getHeader()
读取标头,该标头不使用CellProcessors,但是没有什么可以阻止您使用CellProcessors将标头读作read()
的正常行。每次调用read()
都允许您传入CellProcessors,因此您可以使用3个不同的CellProcessor数组以不同方式处理/验证标头,数据行和校验和。
- 是否允许您验证分隔符(此处的管道“|”) case)必须附加到行的末尾吗?
当您使用|
作为分隔符时,最后一列将被视为空列(null
)。这意味着用于读取标头的CellProcessor数组必须具有4个元素(或数据行为6个),否则您将获得一个异常,表示列数与单元处理器的数量不匹配。通过在末尾放置new Equals(null)
处理器,您基本上可以验证该行以|
结束。
- 是否有或者有任何人写过一个验证的CellProcessor 十六进制值?
您可以使用现有的单元处理器new StrRegex("[0-9A-F]+")
来验证使用正则表达式。您甚至可以使用StrRegex.registerMessage()为验证错误注册人类可读的消息(例如“不是有效的十六进制值”)。
如果要将十六进制解析为数字(可能不是,但以防万一),则Super CSV中不存在ParseHex
CellProcessor。如果你写一个并提交补丁,我会把它包含在即将发布的版本中!根据数字的大小,也许最好更新ParseLong以使另一个接受基数的构造函数(在这种情况下为16)?
我建议保持简单并使用CsvListReader(您可以使用其他阅读器,但您需要定义nameMapping数组以提供标题,数据和校验和行的列名称),如下所示:
使用'header'CellProcessor数组读取第一行(我假设第二列是后续数据行的数量?)。
使用'data'CellProcessor数组读取数据行 n 次(其中 n 由第2个标题列给出)。
< / LI>使用'checksum'CellProcessor数组(可能只有一个ParseChecksum()
)读取校验和。