有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Univocity如何将3(n)行解析为一行(bean)

我正在为我的一个项目评估Univocity解析器,固定宽度平面文件格式从三个细节记录(例如,以AA、BB、CC开头)生成一个记录(Bean)——这个文件可以使用Univocity解析吗
我可以使用recordEndsOnNewline继续阅读并添加一些自定义转换,但是是否有现成的ParserSettings

AA1234 data
BBmore data
CCsome more data row 1 ended
AA5678 data
BBmore data
CCsome more data row 2 ended

更新:

可以使用:setLineSeparator("\nAA");


共 (1) 个答案

  1. # 1 楼答案

    这里是图书馆的作者。首先需要定义字段位置。当你想解析出现在多行中的值时,你必须将recordEndsOnNewLine设置为false,这样你就走上了正确的道路

    如果将形成单个记录的行连接起来,则更容易“看到”每条记录的开始和结束位置:

    String input = "" +
        "AA1234 data\nBBmore data\nCCsome more data row 1 ended\n" +
        "AA5678 data\nBBmore data\nCCsome more data row 2 ended";
    

    根据您提供的示例,可以创建以下字段配置(我假设您不需要“AA”、“BB”和“CC”字符串):

    FixedWidthFields fields = new FixedWidthFields();
    fields
            .addField("a1", 2, 6)
            .addField("a2", 7, 11)
            .addField("b1", 14, 23)
            .addField("c1", 26, 40)
            .addField("c2", 41, 52);
    

    你可以用这个解析你的输入:

    FixedWidthParserSettings settings = new FixedWidthParserSettings(fields);
    settings.getFormat().setLineSeparator("\n");
    settings.setRecordEndsOnNewline(false);
    
    FixedWidthParser parser = new FixedWidthParser(settings);
    
    List<String[]> rows = parser.parseAll(new StringReader(input));
    for (String[] row : rows) {
        System.out.println(Arrays.toString(row));
    }
    

    这将为您提供正确的输出:

    [1234, data, more data, some more data, row 1 ended]
    [5678, data, more data, some more data, row 2 ended]
    

    现在我们知道了每个字段的起点和终点,我们可以定义您的java bean:

    public static class Bean {
        @FixedWidth(from = 2, to = 6)
        @Parsed
        int a1;
    
        @FixedWidth(from = 7, to = 11)
        @Parsed
        String a2;
    
        @FixedWidth(from = 14, to = 23)
        @Parsed
        String b1;
    
        @FixedWidth(from = 26, to = 40)
        @Parsed
        String c1;
    
        @FixedWidth(from = 41, to = 52)
        @Parsed
        String c2;
    
        @Override
        public String toString() {
            return "Bean{" +
                    "a1=" + a1 +
                    ", a2='" + a2 + '\'' +
                    ", b1='" + b1 + '\'' +
                    ", c1='" + c1 + '\'' +
                    ", c2='" + c2 + '\'' +
                    '}';
        }
    }
    

    这样一来,解析输入就变得简单了:

    FixedWidthParserSettings settings = new FixedWidthParserSettings();
    settings.getFormat().setLineSeparator("\n");
    settings.setRecordEndsOnNewline(false);
    settings.setHeaderExtractionEnabled(false); // This one is important as your input has no headers.
    
    FixedWidthRoutines routines = new FixedWidthRoutines(settings);
    for(Bean bean : routines.parseAll(Bean.class, new StringReader(input))){
        System.out.println(bean);
    }
    

    它会将bean打印到输出中,如下所示:

    Bean{a1=1234, a2='data', b1='more data', c1='some more data', c2='row 1 ended'}
    Bean{a1=5678, a2='data', b1='more data', c1='some more data', c2='row 2 ended'}
    

    希望这有帮助