supercsv - SuperCSV 的能力

标签 supercsv

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

例如

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

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

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

最佳答案

  • Does it allow you to validate different lines against different definitions i.e. one for the header record and one for the data records?

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

  • Does it allow you to validate that the delimiter (pipe '|' in this case) must be appended to the end of the line?

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

  • Is there, or has anybody written, a CellProcessor that validates hexadecimal values?

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

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

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

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

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

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

关于supercsv - SuperCSV 的能力,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14328668/

相关文章:

supercsv - 用逗号作为小数点分隔符解析双 superCSV?

java - SuperCSV 中的可选 ParseDate SuperCsvCellProcessorException 是否有解决方法?

java - Eclipse Super CSV 无法正确识别方法

java - 在java中合并多个csv文件

java - 如何在supercsv getHeader中使用编码

java - 格式化 Bean 生成器的 header 字段 - Java

java - 使用 CsvBeanReader 读取列数可变的 CSV 文件

java - 如何在不使用引号字符的分隔文件上使用 Super CSV?

csv - 如何使用 Super CSV 部分读取 CSV 文件

java - 在java中使用SuperCsv读取tsv文件时出现异常