从java中的txt文件中读取分隔行

从java中的txt文件中读取分隔行,java,Java,感谢您的帮助,我正在努力学习java并进行练习。我试图读入一个由管道字符分隔的文本文件,将该数据存储到数组或类中,以便对其进行排序,然后最终将排序后的数据打印回另一个文本文件 输入文件示例: 年龄|名字|中间名|城市 年龄2 |第一名2 |中间名2 |城市2 。。。。。。 等 然后我想按年龄排序,首先是年龄最大的。如果列表中的任何人年龄相同,我想按名字的字母顺序对他们进行排序 最后,我想将这个新的排序数据写入另一个文本文件,例如: 年龄 姓 地点:“城市” 年龄2 名字2,名字2 地点:"城市2

感谢您的帮助,我正在努力学习java并进行练习。我试图读入一个由管道字符分隔的文本文件,将该数据存储到数组或类中,以便对其进行排序,然后最终将排序后的数据打印回另一个文本文件

输入文件示例:
年龄|名字|中间名|城市
年龄2 |第一名2 |中间名2 |城市2
。。。。。。 等

然后我想按年龄排序,首先是年龄最大的。如果列表中的任何人年龄相同,我想按名字的字母顺序对他们进行排序

最后,我想将这个新的排序数据写入另一个文本文件,例如:

年龄

地点:“城市”

年龄2
名字2,名字2
地点:"城市2

我有点不知道从哪里开始。我开始将文件读入数组,但不确定如何将数据保存在一起。我想我是在寻求关于如何最好地处理这件事的帮助。这是我如何开始的

import java.io.BufferedReader;
import java.io.FileReader;

public class split2 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new FileReader("data.txt"));
String line = null;

while ((line = br.readLine()) != null) {
  String[] values = line.split("\\|");
  for (String str : values) {
    System.out.println(str);
  }
}
br.close();
}}
然后我尝试使用这样的逻辑将其分解为自己的数据类型,但遇到了问题,因为我不确定如何通过此处的“|”分隔符进行解析:

try {
        BufferedReader br = new BufferedReader(new FileReader("data.txt"));

        while (true) {
            final String line = br.readLine();
            if (line == null) break;
            age = Integer.parseInt(br.readLine());
            fname = br.readLine();
            lname = br.readLine();
            city = br.readLine();
            System.out.println(age + "\t" + fname + "\t" + lname + "\t" +     city);
        }
任何帮助都将不胜感激。谢谢。

一些更改:

import java.io.BufferedReader; 
import java.io.FileReader;

public class split2 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new FileReader("data.txt"));
String line = null;

while ((line = br.readLine()) != null) {
String[] values = line.split("\\|");

if (values.length<4) continue; // problem !!!  

String age=values[0];
String fname=values[1];
String lname=values[2];
String city=values[3];

System.out.println(age + "\t" + fname + "\t" + lname + "\t" +     city);


}
br.close();
}}
导入java.io.BufferedReader;
导入java.io.FileReader;
公共类拆分2{
公共静态void main(字符串[]args)引发异常{
BufferedReader br=新的BufferedReader(新文件读取器(“data.txt”);
字符串行=null;
而((line=br.readLine())!=null){
String[]value=line.split(“\\\\”);
如果(值。长度某些变化:

import java.io.BufferedReader; 
import java.io.FileReader;

public class split2 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new FileReader("data.txt"));
String line = null;

while ((line = br.readLine()) != null) {
String[] values = line.split("\\|");

if (values.length<4) continue; // problem !!!  

String age=values[0];
String fname=values[1];
String lname=values[2];
String city=values[3];

System.out.println(age + "\t" + fname + "\t" + lname + "\t" +     city);


}
br.close();
}}
导入java.io.BufferedReader;
导入java.io.FileReader;
公共类拆分2{
公共静态void main(字符串[]args)引发异常{
BufferedReader br=新的BufferedReader(新文件读取器(“data.txt”);
字符串行=null;
而((line=br.readLine())!=null){
String[]value=line.split(“\\\\”);
如果(值为0.1.1)
您需要更改while循环的代码块,如下所示-

假设文件中包含4个字段的所有行都带有delimeter
|

您需要更改while循环的代码块,如下所示-


假设当您需要在内存中分组数据时,包含4个字段的文件中的所有行都带有delimeter
|
,那么类是一种很好的方法。您可以很容易地使用
Person
bean来保存所有数据

class Person implements Comparable<Person> {
    private int age;
    private String firstName;
    private String lastName;
    private String city;

    public Person(int age, String firstName, String lastName, String city) {
        this.age = age;
        this.firstName = firstName;
        this.lastName = lastName;
        this.city = city;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    @Override
    public String toString() {
        return age + System.lineSeparator() +
                firstName + ", " + lastName + System.lineSeparator() +
                "Location: " + city;
    }

    @Override
    public int compareTo(Person person) {
        int result = this.age - person.getAge();
        if (result == 0) {
            result = this.firstName.compareTo(person.getLastName());
        }
        return result;
    }
}
class-Person实现可比性{
私人互联网;
私有字符串名;
私有字符串lastName;
私人城市;
公共人物(整数年龄、字符串姓氏、字符串姓氏、字符串城市){
这个。年龄=年龄;
this.firstName=firstName;
this.lastName=lastName;
this.city=城市;
}
公共整数getAge(){
回归年龄;
}
公共无效设置(整数){
这个。年龄=年龄;
}
公共字符串getFirstName(){
返回名字;
}
public void setFirstName(字符串firstName){
this.firstName=firstName;
}
公共字符串getLastName(){
返回姓氏;
}
public void setLastName(字符串lastName){
this.lastName=lastName;
}
公共字符串getCity(){
回归城市;
}
公共城市(字符串城市){
this.city=城市;
}
@凌驾
公共字符串toString(){
返回年龄+系统.lineSeparator()+
firstName+“,”+lastName+System.lineSeparator()+
“地点:”+城市;
}
@凌驾
公共国际比较(个人){
int result=this.age-person.getAge();
如果(结果==0){
结果=this.firstName.compareTo(person.getLastName());
}
返回结果;
}
}
那么你的阅读和写作就会像

List<Person> people = new ArrayList<>();

try (BufferedReader br = new BufferedReader(new FileReader("data.txt"))) {
    String line;
    while ((line = br.readLine()) != null) {
        String[] parts = line.split(" \\| ");
        people.add(new Person(Integer.parseInt(parts[0]), parts[1], parts[2], parts[3]));
    }
} catch (IOException e) {
    System.err.println("Error reading file");
}

Collections.sort(people);

try (BufferedWriter bw = new BufferedWriter(new FileWriter("output.txt"))) {
    for (int i = 0; i < people.size(); i++) {
        if (i > 0) {
            bw.write(System.lineSeparator());
            bw.write(System.lineSeparator());
        }
        bw.write(people.get(i).toString());
    }
} catch (IOException e) {
    System.err.println("Error writing file");
}
List people=new ArrayList();
try(BufferedReader br=newbufferedreader(newfilereader(“data.txt”)){
弦线;
而((line=br.readLine())!=null){
String[]parts=line.split(“\\\\”);
添加(新的Person(Integer.parseInt(部分[0])、部分[1]、部分[2]、部分[3]);
}
}捕获(IOE异常){
System.err.println(“读取文件时出错”);
}
收藏。分类(人);
try(BufferedWriter bw=newbufferedwriter(newfilewriter(“output.txt”)){
for(inti=0;i0){
write(System.lineSeparator());
write(System.lineSeparator());
}
write(people.get(i.toString());
}
}捕获(IOE异常){
System.err.println(“错误写入文件”);
}

如果您不介意尾随空格的话,可以在通过
Person
对象循环时使用增强的for循环。

当您需要在内存中分组数据时,类是一种很好的方法。您可以很容易地使用
Person
bean来保存所有数据

class Person implements Comparable<Person> {
    private int age;
    private String firstName;
    private String lastName;
    private String city;

    public Person(int age, String firstName, String lastName, String city) {
        this.age = age;
        this.firstName = firstName;
        this.lastName = lastName;
        this.city = city;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    @Override
    public String toString() {
        return age + System.lineSeparator() +
                firstName + ", " + lastName + System.lineSeparator() +
                "Location: " + city;
    }

    @Override
    public int compareTo(Person person) {
        int result = this.age - person.getAge();
        if (result == 0) {
            result = this.firstName.compareTo(person.getLastName());
        }
        return result;
    }
}
class-Person实现可比性{
私人互联网;
私有字符串名;
私有字符串lastName;
私人城市;
公共人物(整数年龄、字符串姓氏、字符串姓氏、字符串城市){
这个。年龄=年龄;
this.firstName=firstName;
this.lastName=lastName;
this.city=城市;
}
公共整数getAge(){
回归年龄;
}
公共无效设置(整数){
这个。年龄=年龄;
}
公共字符串getFirstName(){
返回名字;
}
public void setFirstName(字符串firstName){
this.firstName=firstName;
}
公共字符串getLastName(){
返回姓氏;
}
public void setLastName(字符串lastName){
this.lastName=lastName;
}
公共字符串getCity(){
回归城市;
}
公共城市(字符串城市){
this.city=城市;
}
@凌驾
公共字符串toString(){
返回年龄+系统.lineSeparator()+
名字+“,”+