SuperCSV的能力

时间:2013-01-14 23:25:04

标签: supercsv

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

e.g。

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

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

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

1 个答案:

答案 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数组以提供标题,数据和校验和行的列名称),如下所示:

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

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

    < / LI>
  3. 使用'checksum'CellProcessor数组(可能只有一个ParseChecksum())读取校验和。