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

用流API Java解析文本文件

蓝鸿哲
2023-03-14

我有这个文件要处理,我正试图找出如何将第二行作为不同的对象来读取。在这一行的末尾,最后一项是公交车的数量。第二行、第四行等应包含idBus和noOfBus,并用逗号分隔。

1,Harvard University,2
1,140,2,56
2,Massachusetts Institute of Technology,2
1,240,5,56
3,University of California Berkeley,3
1,112,2,56,3,28
4,Columbia University,4
1,84,2,84,3,84,7,28

基于这些课程

 class University {
    public int idUniversity;
    public String nameOfUniversity;
    public int noOfBuses;
 }

 class Bus {
    public int idBus;
    public int noOfBus;
 }

我想要一个函数来处理CSV文件中所有公交车和大学线路的列表。它必须使用流API。我不知道这是否可能或如何进行。

当然,可以根据类进行更改,但保留变量,不添加任何额外内容。

我认为最方便的方法是浏览文件,根据两个班级(大学和公共汽车)得到两个列表,最后将它们添加到第三个列表中,然后进行处理,但我不知道如何处理。

基于这个文件,我必须使用Stream API进行处理,例如"按ID对公共汽车进行排序"或"哪些大学有更多的公共汽车?"或"哪辆公共汽车去几所大学?"。

这就是我一直在努力做的。通常这就是我浏览CSV文件的方式。

private static List<University> readListOfUniversities() throws IOException {
    try (BufferedReader bufferedReader = new BufferedReader(new FileReader(PATH_UNIVERSITIES_TEXT_FILE))) {
        return bufferedReader.lines().map(line -> {
            String[] tokens = line.split(",");
            var idUniversity = Integer.parseInt(tokens[0]);
            var nameOfUniversity = tokens[1].trim();
            var noOfBuses = Integer.parseInt(tokens[2]);
            var university = new University(idUniversity, nameOfUniversity, noOfBuses);
            return university;
        }).collect(Collectors.toList());
    }
}

就像这个:

1,Harvard University,2
2,Massachusetts Institute of Technology,2
3,University of California Berkeley,3
4,Columbia University,4

共有1个答案

吕霄
2023-03-14

以下是我将如何做到这一点(我对您的类做了一些轻微的修改)

public class University {
    private int id;
    private String name;
    private List<Bus> busList;
    //let the constructor do the work
    public University(String [] data, List<Bus> busList) {
        id = Integer.parseInt(data[0]);
        name = data[1];
        this.busList = busList; 
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public List<Bus> getBusList() {
        return busList;
    }

    @Override
    public String toString() {
        return "University [id=" + id + ", name=" + name + ", busList=" + busList + "]";
    }
    
}

public class Bus {
    private int id;
    private int num;
    
    public Bus(int id, int num) {
        this.id = id;
        this.num = num;
    }
    
    public int getId() {
        return id;
    }

    public int getNum() {
        return num;
    }
    //Method to parse the data into usuable objects
    public static List<Bus> generateBusInfo(String [] data) {
        List<Bus> buses = new ArrayList<>();
        for (int i = 0; i < data.length-1; i+=2) {
            int id = Integer.parseInt(data[i]);
            int num = Integer.parseInt(data[i+1]);
            buses.add(new Bus(id, num));
        }
        return buses;
    }

    @Override
    public String toString() {
        return "Bus [id=" + id + ", num=" + num + "]";
    }
}


public static void main(String[] args) throws IOException {
    //This is just so I dont have to bother with creating a file.
    String input = "1,Harvard University,2\n" + 
            "1,140,2,56\n" + 
            "2,Massachusetts Institute of Technology,2\n" + 
            "1,240,5,56\n" + 
            "3,University of California Berkeley,3\n" + 
            "1,112,2,56,3,28\n" + 
            "4,Columbia University,4\n" + 
            "1,84,2,84,3,84,7,28\n";
    List<University> universities = new ArrayList<>();
    //replace StringReader with a FileReader to the path of your file.
    try(BufferedReader reader = new BufferedReader(new StringReader(input))) {
        //read the first line
        String line = reader.readLine();
        while (line != null) { //keep reading until you're done
            String [] uniData = line.split(","); //convert string into an array
            line = reader.readLine(); //read the next line
            if (line != null) {
                String [] busData = line.split(","); //convert
                List<Bus> busList = Bus.generateBusInfo(busData); //make busses
                universities.add(new University(uniData, busList)); //create university and add it to the list
                line = reader.readLine(); //read the next line
            }
        }
    }
    
    //output the list
    for (University uni : universities) {
        System.out.println(uni);
    }
}

您还可以将大学和公共汽车读入Maps以方便访问。

 类似资料:
  • 我无法理解为什么当我通过的文本符合格式时,我会得到DateTimeParseException错误。下面是导致该问题的代码: 奇怪的是。每当我查询用户一段时间(让我们以00:02:30为例),它就会完全按照我想要的方式运行。但是当我使用我的方法(从文本文件中提取时间)时,它会出现错误: 线程“main”java.time.format.DateTimeParseException中出现异常:无法分

  • 我有一个XML文件,其中包含大量员工记录(比如高达1M),如下所示: 我使用JAXB将员工记录映射到以下Java对象: XML的内容不能被更改,并且给定这个XML,我如何使用JAXB将每个员工XML记录解封给员工对象,以便我可以逐个处理它?

  • 我有一个包含员工信息的文本文件。第一个单词是员工的姓氏,第二个单词是第一个名字。字符代码h或s告诉我他们是什么样的员工,有薪或小时。最后,字符代码后面的数字是小时工资(如果为小时工)或年薪(如果为受薪员工)。 我想对这些信息做的是扫描文本文件,根据识别的字符代码自动创建新的受薪员工对象或小时员工对象。 这些是小时雇员对象的参数。 这就是我想到的。 这段代码的问题是,我从in.nextDouble(

  • 问题内容: 我有一系列使用Beautiful Soup解析为单个文本文件的HTML文件。HTML文件的格式设置为使其输出始终为文本文件中的三行,因此输出将类似于: 但这很容易 换句话说,HTML文件的内容在每个文件中并不是真正的标准,但是它们始终会产生三行。 因此,我想知道如果我想从Beautiful Soup生成的文本文件然后将其解析为带有以下内容的列的CSV文件(使用上面的示例),应该从哪里开

  • 我正在使用snmp4j开发snmp管理器。我需要读取MIB文本文件并生成相应的XML文件。是否有任何SNMP4j库可用于解析Mib文本文件并获取每个对象的数据。如果snmp4j不能解决我的问题,是否有其他类似的开源可用? 谢谢

  • 问题内容: 我是Python的新手,我搜索如何解析.txt文件。我的.txt文件是一个包含计算信息的名称列表,例如: myfile.txt var0 = 16 var1 = 1.12434E10 var2 = -1.923E-3 var3 = 920 如何读取值并将其放入python中? 问题答案: 我建议将值存储在字典中,而不是存储在单独的局部变量中: 现在以身份访问它们。如果名称都是有效的py