【问题标题】:Abilities of SuperCSVSuperCSV 的能力
【发布时间】:2012-12-29 00:23:35
【问题描述】:

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

例如

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

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

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

【问题讨论】:

    标签: supercsv


    【解决方案1】:
    • 它是否允许您针对不同的行验证不同的行 定义,即一个用于标题记录,一个用于数据 记录?

    是的。通常,您会使用不使用 CellProcessors 的 getHeader() 读取标题,但没有什么可以阻止您使用 CellProcessors 将标题作为普通行读取 read()。对read() 的每次调用都允许您传入 CellProcessor,因此您可以使用 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 由第二个标题列给出)。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-13
      • 1970-01-01
      • 2023-01-13
      • 1970-01-01
      • 1970-01-01
      • 2012-09-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多