【问题标题】:JAVA8, parsing text file and parsing its values to objectsJAVA8,解析文本文件并将其值解析为对象
【发布时间】:2018-10-04 13:52:35
【问题描述】:

我的特定文本文件如下所示:

name: meeting_name1
description: 
04/18/2012 00:00:00
05/18/2012 00:00:00
... (more dates)
07/18/2012 00:00:00
name: meeting_name2
description: some_desc
04/18/2012 00:00:00
05/18/2012 00:00:00
... (more dates)
07/18/2012 00:00:00
(etc)

我的 java 对象看起来像这样:

class Meeting {
    String name;
    String description;
    List<Date> dates;
}

我的意思是读取文件、解析值、创建对象并将它们保存到数据库。

我可以逐行读取文件并将其转换为List&lt;String&gt;,即。所有数据在一起。 `我可以用值创建和填充一个 java 对象并将其保存到数据库中。

我的问题是如何找出我在新对象开始的日期和行(名称:meeting_name2)的末尾。

所以我可以制作类似List&lt;List&lt;String&gt;&gt; 的东西,其中List&lt;String&gt; 将等于一个对象,即。 List&lt;Meeting&gt;?

不确定是否可以理解,抱歉格式化。

【问题讨论】:

  • 根据示例输入,名称和描述可以通过它们的键:值格式识别,因此如果该行不代表名称并且该行不代表描述,则可以安全地假设该行代表一个日期。另外,如果可以,请使用LocalDate 而不是Date
  • 这不是很清楚。也许你可以添加一些代码来展示你到目前为止所做的以及你想要实现的目标
  • 如果名称总是在描述之前,那么每当遇到代表名称的行时,就需要一个新的Meeting 实例。

标签: java file object text mapping


【解决方案1】:

假设您可以将文件数据读取到 List 变量。 (见上面的答案)

List<String> lines = Files.readAllLines(Paths.get("FILE_NAME"));

现在,您可以看到以下代码作为演示。这是简单的循环和 if else 语句。 希望对你有帮助。

public static void main(String[] args) throws ParseException {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
        List<String> data = new ArrayList<>();
        data.add("name: meeting_name1");
        data.add("description: some_desc");
        data.add("07/18/2012 00:00:00");
        data.add("07/18/2012 00:00:00");
        data.add("name: meeting_name2");
        data.add("description: some_desc");
        data.add("07/18/2012 00:00:00");

        List<Meeting> result = new ArrayList<>();
        Meeting temp = null;
        for (String line : data) {
            if (line.startsWith("name:")) {
                temp = new Meeting(line.split(":")[1].trim());
                result.add(temp);
            } else if (line.startsWith("description:")) {
                temp.setDescription(line.split(":")[1].trim());
            } else {
                temp.getDates().add(simpleDateFormat.parse(line)); // Use date for
            }
        }
        System.out.println(result.get(0).getName() + ": " + result.get(0).getDates().size()); // meeting_name1: 2
        System.out.println(result.get(1).getName() + ": " + result.get(1).getDates().size()); // meeting_name2: 1    
    }

    static class Meeting {
        String name;
        String description;
        List<Date> dates;

        public String getName() {
            return name;
        }

        public List<Date> getDates() {
            return dates;
        }

        Meeting(String name) {
            this.name = name;
            this.dates = new ArrayList<>();
        }

        public void setDescription(String description) {
            this.description = description;
        }
    }

【讨论】:

  • try (Stream&lt;String&gt; stream = Files.lines(f)) { List&lt;String&gt; ls = stream.sequential().collect(Collectors.toList()); ls.forEach( c-&gt; System.out.println(c)); }
  • 1) readAllLines - 是一种将文件的全部内容读取到内存的 java 7 方式,因为它读取完整的文件,如果文件太大,它可能会失败,因为它无法容纳进入记忆。 2) lines - 是一种读取文件内容的 java 8 方式,它与 readAllLines 在两个方面不同:a) 它返回一个 Stream 对象,b) 输出(流)是惰性填充的,意思是,它不会预先读取文件。它会在您使用流的元素时读取文件。
【解决方案2】:

一种可能性是先读取所有行。您无需担心行尾:

List<String> lines = Files.readAllLines(Paths.get("FILE_NAME"));

然后遍历数组, 如果一行以“名称:”开头,则创建一个新对象并像这样添加数据:

        List<Meeting> meetings = new ArrayList();
        Meeting currentMeeting;

        for (String line : lines) {
            if(line.startsWith("name:"))
            {
                currentMeeting = new Meeting();
                meetings.add(currentMeeting);
                //...add data (name)
            }
            //...add more data (description and dates)
        }

【讨论】:

    猜你喜欢
    • 2013-03-17
    • 1970-01-01
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    • 1970-01-01
    相关资源
    最近更新 更多