如何将信息从txt文件读取到arraylist中

时间:2019-05-05 09:30:46

标签: java

我有一个txt文档,其中每一行都是独立的消息。这可能包括姓名,出生日期,地址等。除地址外,所有其他信息都位于一行中。他们的顺序不固定。名称和生日必须可用,其他信息可能不可用。如果没有名字或生日,则此人应被忽略。不同的人使用空白行来区分它们。我想阅读这些信息并将其放入arraylist,但是我不知道如何编写代码。

我最初的想法是使用循环读取内容并将其存储,如果有空白行,则开始保存其他内容。但是我不知道如何具体实现代码。

public class InforProcessor {
    private File recordFile;
    private File instructionFile;
    private File outputFile;
    private InforList inforlist;

    public InforProcessor(String[]s)
    {
        recordFile = new File(s[0]);
        instructionFile = new File(s[1]);
        outputFile = new File(s[2]);
        inforlist =  new InforList();
    }
}

这是我现有的代码,我想读取recordFile的内容并写入arraylist。

输入文件如下:

    name john
    birthday 11-11-2015
    Address 11 Harry St, montain, TRY

    birthday 12-25-2017
    name peter

    Postcode 2005
    name jane
    birthday 25-19-1998
    Address 25 jeoje St, Sky, FLY

    Postcode 1998
    name geoge

输出信息或有用信息应为:

    name john
    birthday 11-11-2015
    Address 11 Harry St, montain, TRY

    birthday 12-25-2017
    name peter

    Postcode 2005
    name jane
    birthday 25-19-1998
    Address 25 jeoje St, Sky, FLY

应该删除最后一个信息,因为它没有生日。

1 个答案:

答案 0 :(得分:0)

首先,您需要从文件中读取所有行,并且每条消息都由空行分隔。

第二,反复检查消息并检查消息是否有效,如果消息有效,则将消息添加到列表中。

private static List<String> filterFile(final String input) throws Exception {
    List<String> result = new ArrayList<>();
    List<String> lines = FileUtils.readLines(new File(input), "UTF-8");
    System.out.println(lines.size());
    int begin = 0;
    int end = 0;
    for (; end < lines.size(); end++) {
        if (Strings.isNullOrEmpty(lines.get(end))) {
            if (isValidInfo(lines, begin, end)) {
                result.addAll(lines.subList(begin, end + 1));
            }
            begin = end + 1;
        }
    }
    return result;
}

如果消息中有名字和生日,则是我们想要的消息。

private static boolean isValidInfo(List<String> infos, int begin, int end) {
    int counts = 0;
    for (int i = begin; i < end; i++) {
        String line = infos.get(i);
        if (line.startsWith("name")) {
            counts++;
        }
        if (line.startsWith("birthday")) {
            counts++;
        }
    }

    return counts == 2;
}