3

我正在考虑使用 SuperCSV 检查我收到的一些文件的内容。文件的格式是这样的:它有一个标题记录,后跟数据记录,然后是 CRC32 校验和值。

例如

ABC|2|20130115150327|
1|1234567890123456|1234|20130109204710|21130109204710|
2|6543210987654321|1234|20130110043658|21130110043658|
1A345C7D

在这种情况下,我对 SuperCSV 的功能有几个疑问。

  • 它是否允许您针对不同的定义验证不同的行,即一个用于标题记录,一个用于数据记录?
  • 它是否允许您验证分隔符(在这种情况下为管道“|”)必须附加到行尾?
  • 是否有或有人编写过验证十六进制值的 CellProcessor?
4

1 回答 1

5
  • 它是否允许您针对不同的定义验证不同的行,即一个用于标题记录,一个用于数据记录?

是的。通常,您会getHeader()使用不使用 CellProcessors 来读取标题,但没有什么可以阻止您read()使用 CellProcessors 将标题作为普通行读取。每次调用都read()允许您传入 CellProcessor,因此您可以使用 3 个不同的 CellProcessor 数组以不同方式处理/验证标题、数据行和校验和。

  • 它是否允许您验证分隔符(在这种情况下为管道“|”)必须附加到行尾?

当您|用作分隔符时,最后一列将被视为空列 ( null)。这意味着用于读取标题的 CellProcessor 数组必须有 4 个元素(或 6 个用于数据行),否则您将收到异常,指出列数与单元处理器的数量不匹配。通过在末尾放置一个new Equals(null)处理器,您基本上可以验证该行是否以|.

  • 是否有或有人编写过验证十六进制值的 CellProcessor?

您可以使用现有的单元处理器new StrRegex("[0-9A-F]+")使用正则表达式进行验证。您甚至可以使用StrRegex.registerMessage() 为验证错误注册一条人类可读的消息(例如“不是有效的十六进制值”)

如果您想将十六进制解析为数字(可能不是,但以防万一),那么ParseHexSuper CSV 中没有现有的 CellProcessor。如果您编写一个并提交一个补丁,我会将它包含在即将发布的版本中!根据数字的大小,也许最好更新ParseLong以拥有另一个接受基数(在本例中为 16)的构造函数?

我建议保持简单并使用CsvListReader(您可以使用其他阅读器,但您需要定义一个 nameMapping 数组来为标题、数据和校验和行提供列名),如下所示:

  1. 使用 'header' CellProcessor 数组读取第一行(我假设第二列是后面的数据行数?)。

  2. 使用“数据”CellProcessor 数组读取数据行n次(其中n由第二个标题列给出)。

  3. 使用“校验和”CellProcessor 数组(可能只是一个ParseChecksum())读取校验和。

于 2013-01-15T03:12:25.893 回答