当前位置: 首页 > 知识库问答 >
问题:

Univocity-将每个TSV文件行解析为不同类型的类对象

薄鸿远
2023-03-14

我有一个tsv文件,它有固定的行,但每一行都映射到不同的Java类。

例如

recordType  recordValue1
recordType  recordValue1 recordValue2

对于第一排,我有后续类:

public class FirstRow implements ItsvRecord {

    @Parsed(index = 0)
    private String recordType;

    @Parsed(index = 1)
    private String recordValue1;

    public FirstRow() {
    }
}

第二排我有:

public class SecondRow implements ItsvRecord {

    @Parsed(index = 0)
    private String recordType;

    @Parsed(index = 1)
    private String recordValue1;

    public SecondRow() {
    }
}

我想将TSV文件直接解析到相应的对象,但我没有什么想法。

共有1个答案

咸皓
2023-03-14

使用InputValueSwitch。这将匹配每行特定列中的值,以确定要使用的Row处理机。示例:

final BeanListProcessor<FirstRow> firstProcessor = new BeanListProcessor<FirstRow>(FirstRow.class);
final BeanListProcessor<SecondRow> secondProcessor = new BeanListProcessor<SecondRow>(SecondRow.class);
//0 means that the first column of each row has a value that 
//identifies what is the type of record you are dealing with
InputValueSwitch valueSwitch = new InputValueSwitch(0);

//assigns the first processor to rows whose first column contain the 'firstRowType' value
valueSwitch.addSwitchForValue("firstRowType", firstProcessor);

//assigns the second processor to rows whose first column contain the 'secondRowType' value
valueSwitch.addSwitchForValue("secondRowType", secondProcessor);
TsvParserSettings settings = new TsvParserSettings(); //configure...
// your row processor is the switch
settings.setProcessor(valueSwitch);

TsvParser parser = new TsvParser(settings);

Reader input = new StringReader(""+
        "firstRowType\trecordValue1\n" +
        "secondRowType\trecordValue1\trecordValue2");

parser.parse(input);
List<FirstRow> firstTypeObjects = firstProcessor.getBeans();
List<SecondRow> secondTypeObjects = secondProcessor.getBeans();
[FirstRow{recordType='firstRowType', recordValue1='recordValue1'}]

[SecondRow{recordType='secondRowType', recordValue1='recordValue1', recordValue2='recordValue2'}]
  • 假设在类中实现了一个sane toString()

如果您的FirstRow应该包含为SecondRow类型的记录解析的元素,只需重写rowProcessorSwitched方法:

    InputValueSwitch valueSwitch = new InputValueSwitch(0) {
    @Override
    public void rowProcessorSwitched(RowProcessor from, RowProcessor to) {
        if (from == secondProcessor) {
            List<FirstRow> firstRows = firstProcessor.getBeans();
            FirstRow mostRecentRow = firstRows.get(firstRows.size() - 1);

            mostRecentRow.addRowsOfOtherType(secondProcessor.getBeans());
            secondProcessor.getBeans().clear();
        }
    }
};
  • 以上假设您的FirstRow类有一个addRowsOfOtherType方法,该方法将SecondRow列表作为参数

您甚至可以混合和匹配其他类型的Row处理机。这里有另一个例子可以证明这一点。

希望这有帮助。

 类似资料:
  • 是否可以根据索引范围将一行解析为多个bean 例: 行:“字段1”、“字段2”、“字段3”。。。。,“字段9”

  • 我在做某种“游戏分数追踪器”。以下是该应用程序当前的工作方式: 用户通过在EditText中键入名称,然后单击“确定”按钮来添加播放机。 用户添加完新玩家后,按“开始游戏”按钮,新活动将打开。 玩家将被添加到可参与的额外活动中,并被带到下一个活动中。 在下一个活动中,用户有一个spinner、EditText和+、-按钮。当用户从旋转器中选择某个玩家,输入某个分数,然后输入+或-后,将出现一个新的

  • 我对JSP是新手。我正在学习useBean方法,在 http://www.studytonight.com/jsp/getproperty-tag.php 我得到了一个错误:在jsp文件中:/hello1的第5行发生了一个错误。jsp PersonBean无法解析为类型

  • 我想在eclipse IDE中使用Java编写1.18.2 Minecraft插件。我很确定我正在使用最新版本。我正在使用教程,当它说要把这个放进去时: 在JavaPlugin下面显示了一条红线,它说它不能被解析为一个类型。我应该导入这个: 导入组织。巴基特。插件。JAVAJavaPlugin 我在谷歌上搜索到的每一句话都把这个插口罐放在了项目属性中

  • 我正在尝试从GTFS读取CSV文件。在uniVocity解析器的帮助下压缩,遇到了一个我无法解决的问题。出于某种原因,某些CSV文件的第一列似乎无法正确解析。例如,在“stops.txt”文件中,如下所示: 无法正确解析“stop_id”字段,该字段的值为“null” 这是我用来读取文件的方法: 这就是我的Stop课程的样子: 如果我调用的方法,我得到这个输出是不正确的: 输出: 有人知道为什么会

  • 对于下面的代码,我得到了不同的输出 输出为: 现在美国/洛杉矶是GMT-8/UTC-8或PST。但当我将参数从GMT-8改为America/Los_Angeles时, 输出为: 不能使用类似PST的缩写,因为它已被弃用。同时,CST可以指中央标准时间和中国标准时间。 我的输入是-8、-9-14等,我希望在GMT/UTC之前知道我是否可以在给定日期获得DST激活。 请在这方面指导我。