如何读取Java中生成的类似表视图的纯文本?

如何读取Java中生成的类似表视图的纯文本?,java,Java,我想知道如何在java中读取这样的表视图中的文本文件。问题是某些列中的某些数据为空。有没有简单的方法来理解如何理解它 ----------------------------------------------------------------------------- PRES HGHT TEMP DWPT RELH MIXR DRCT SKNT THTA THTE THTV -----------------------------------

我想知道如何在java中读取这样的表视图中的文本文件。问题是某些列中的某些数据为空。有没有简单的方法来理解如何理解它

-----------------------------------------------------------------------------
   PRES   HGHT   TEMP   DWPT   RELH   MIXR   DRCT   SKNT   THTA   THTE   THTV
-----------------------------------------------------------------------------
  994.0    270    7.0    6.0     93            40     10  280.6  297.1  281.6
  989.0    312    6.2    5.2     93   5.64     42     12         295.9  281.2
  972.0    455    4.8    4.0     95   5.27     48     18  280.2  294.9  281.1

下面的代码允许将给定的输入数据读取到自定义行列表中

为了简洁起见,它使用了Java流和Lombok注释

出于演示目的,输入数据已略微更改,以在第一列和最后一列中提供空值

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.ToString;

import java.util.Arrays;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class ParseSpaceSeparated {

    @Getter
    @ToString
    @AllArgsConstructor
    static class MyRow {
        final Double pres;
        final Integer hght;
        final Double temp;
        final Double dwpt;
        final Integer relh;
        final Double mixr;
        final Integer drct;
        final Integer sknt;
        final Double thta;
        final Double thte;
        final Double thtv;

        public MyRow(String[] cols) {
            this(
                parseDouble(cols[0]), parseInt(cols[1]),
                parseDouble(cols[2]), parseDouble(cols[3]),
                parseInt(cols[4]), parseDouble(cols[5]),
                parseInt(cols[6]), parseInt(cols[7]),
                parseDouble(cols[8]), parseDouble(cols[9]), parseDouble(cols[10])
            );
        }
    }

    // helper method to parse integer value
    private static Integer parseInt(String s) {
        if (null == s || s.isBlank()) return null;
        return Integer.valueOf(s);
    }

    // helper method to parse double value
    private static Double parseDouble(String s) {
        if (null == s || s.isBlank()) return null;
        return Double.valueOf(s);
    }

    public static void main (String[] args) {
        // prepared stream of string lines on the basis of list; 
        // may be get as a stream of lines using Files.lines(Path.of("filename.data"))

        Stream<String> dataStream = Arrays.asList(
            "----------------------------------------------------------------------------- ",
            "   PRES   HGHT   TEMP   DWPT   RELH   MIXR   DRCT   SKNT   THTA   THTE   THTV ",
            "----------------------------------------------------------------------------- ",
            "           270    7.0    6.0     93            40     10  280.6  297.1  281.6 ",
            "  989.0    312    6.2    5.2     93   5.64     42     12         295.9  281.2 ",
            "  972.0    455    4.8    4.0     95   5.27     48     18  280.2  294.9        "
        ).stream();

        dataStream
            .skip(3) // skip 3-line header 
            .map(line ->
                    // provide better column delimiters
                    line.replaceAll("(\\s{2}(\\d+(\\.\\d+)?|\\s{4,5}))", "$1\\|")
                        .split("\\s*\\|\\s*", -1) // split by | including empty columns
            )
            .map(MyRow::new) // convert to row object
            .collect(Collectors.toList()) // get list of rows
            .forEach(System.out::println);
    }
}


如果您知道用于列的格式和/或分隔符(在这种情况下,它可能是一个选项卡
\t
),则可以逐行读取,然后解析每一行。或者你可以找一些库来阅读类似CSV的文件。非常感谢你。。。它救了我@阿列克斯鲁登科
ParseSpaceSeparated.MyRow(pres=null, hght=270, temp=7.0, dwpt=6.0, relh=93, mixr=null, drct=40, sknt=10, thta=280.6, thte=297.1, thtv=281.6)
ParseSpaceSeparated.MyRow(pres=989.0, hght=312, temp=6.2, dwpt=5.2, relh=93, mixr=5.64, drct=42, sknt=12, thta=null, thte=295.9, thtv=281.2)
ParseSpaceSeparated.MyRow(pres=972.0, hght=455, temp=4.8, dwpt=4.0, relh=95, mixr=5.27, drct=48, sknt=18, thta=280.2, thte=294.9, thtv=null)