Home > other >  How to read from a .txt file into an array of objects
How to read from a .txt file into an array of objects

Time:05-15

I have the following sample data in a .txt file

111, Sybil, 21
112, Edith, 22
113, Mathew, 30
114, Mary, 25

the required output is

[{"number":"111","name":"Sybil","age":"21" },
{"number":"112","name":"Edith","age":"22"},
{"number":"113","name":"Mathew","age":"30"},
"number":"114","name":"Mary","age":"25"]

Sadly, I have not gone far because I cant seem to get the values out of each line. instead, this is what is displayed

[one, two, three]

    private void loadFile() throws FileNotFoundException, IOException {
        File txt = new File("Users.txt");
        try (Scanner scan = new Scanner(txt)) {
            ArrayList data = new ArrayList<>() ;
            while (scan.hasNextLine()) {
                
                data.add(scan.nextLine());
                 System.out.print(scan.nextLine()); 
            }
             System.out.print(data); 
               
            
        }

I would appreciate any help. thank you

CodePudding user response:

Not too sure about the requirements. If you just need to know how to get the values out, then use String.split() combined with Scanner.nextLine().

Codes below:

    private void loadFile() throws FileNotFoundException, IOException {
    File txt = new File("Users.txt");
    try (Scanner scan = new Scanner(txt)) {
        ArrayList data = new ArrayList<>();
        while (scan.hasNextLine()) {
            // split the data by ", " and split at most (3-1) times
            String[] input = scan.nextLine().split(", ", 3);
            data.add(input[0]);
            data.add(input[1]);
            data.add(input[2]);

            System.out.print(scan.nextLine());
        }
        System.out.print(data);
    }
}

The output would be as below and you can further modify it yourself:

[111, Sybil, 21, 112, Edith, 22, 113, Mathew, 30, 114, Mary, 25]

However, if you need the required format as well, the closest I can get is by using a HaspMap and put it into the ArrayList.

Codes below:

    private void loadFile() throws FileNotFoundException, IOException {
    File txt = new File("Users.txt");
    try (Scanner scan = new Scanner(txt)) {
        ArrayList data = new ArrayList<>();
        while (scan.hasNextLine()) {
            // Create a hashmap to store data in correct format,
            HashMap<String, String> info = new HashMap();
            String[] input = scan.nextLine().split(", ", 3);
            info.put("number", input[0]);
            info.put("name", input[1]);
            info.put("age", input[2]);
            
            // Put it inside the ArrayList
            data.add(info);
        }
        System.out.print(data);
    }
}

And the output would be:

[{number=111, name=Sybil, age=21}, {number=112, name=Edith, age=22}, {number=113, name=Mathew, age=30}, {number=114, name=Mary, age=25}]

Hope this answer helps you well.

CodePudding user response:

Currently you're skipping lines, to quote the Scanner::nextLine documentation:

This method returns the rest of the current line, excluding any line separator at the end. The position is set to the beginning of the next line.

So you add one line to your list and write the next to the console.

To get the data from each line you can use the String::split method, which supports RegEx. (example: "line of my file".split(" "))

CodePudding user response:

We can use streams to write some compact code.

First we define a record to hold our data.

Files.lines reads your file into memory, producing a stream of strings, one per line.

We call Stream#map to produce another stream, a series of string arrays. Each array has three elements, the three fields within each line.

We call map again, this time to produce a stream of Person objects. We construct each person object by parsing and passing to the constructor each of line’s three fields.

We call Stream#toList to collect those person objects into a list.

We call List#toString to generate text representing the contents of the list of person objects.

record Person ( int id , String name , int age ) {}
String output = 
    Files
    .lines( Paths.of("/path/to/Users.txt" ) )
    .map( line -> line.split( ", " ) )
    .map( parts -> new Person( 
        Integer.parseInt( parts[ 0 ] ) , 
        parts[ 1 ] ,
        Integer.parseInt( parts[ 2 ] ) 
    ) )
    .toList()
    .toString() 
;

If the format of the default Person#toString method does not suit you, add an override of that method to produce your desired output.

  • Related