BodhiByte
BodhiByte

Reputation: 209

Java: How can I read text and numbers from a file

I am creating a simple program to data read from a text file. The file stores information about a person, with the name, age and a number on each line:

Eg: File format per line

      Francis Bacon  50    2

I can read in a file no problem if it is just text, but I am confused on how to differentiate between text and numbers. Here is a look at my code:

import java.io.*;


public class Test{

    private People people[] = new People[5];


    public Test(){
        BufferedReader input;

        input = new BufferedReader(new FileReader("People.txt"));// file to be readfrom
        String fileLine;
        int i = 0;

        while (test != null){
            fileLine = input.readLine(); 

            // Confused as to how to parse this line into seperate parts and store in object:
            // eg:
            people[i].addName(fileLine - part 1);
            people[i].addBookNo(fileLine - part 2);
            people[i].addRating(fileLine - part 3)

            i++

        }

    }

}

Upvotes: 2

Views: 4260

Answers (3)

EdgeCase
EdgeCase

Reputation: 4827

The following regex works on these 3 cases, breaking them into 3 matched groups.

Regex (.*)\s+(\d+)\s+(\d+)

Cases

Francis Bacon  50    2
Jill St. John 20 20
St. Francis Xavier III 3 3 

Upvotes: 1

gprathour
gprathour

Reputation: 15333

If you want to do in this way, you can try doing like this :

  1. Fixing the way data will be present in the file, say

    firstName.lastName.age.number;

  2. Then you can write code to read data upto . and store it in a variable (you will be knowing what it is meant for) and after ";" there will be second entry.

Upvotes: 0

aioobe
aioobe

Reputation: 421310

I strongly suggest you use the Scanner class instead. That class provides you with methods such as nextInt and so on.

You could use it to read from the file directly like this:

Scanner s = new Scanner(new File("People.txt"));

while (s.hasNext()) {
    people[i].addName(s.next());
    people[i].addBookNo(s.nextInt());
    people[i].addRating(s.nextInt());
}

(Just realized that you may have spaces in the name. That complicates things slightly, but I would still consider using a scanner.)

An alternative solution would be to use a regular expression and groups to parse the parts. Something like this should do:

(.*?)\s+(\d+)\s+(\d+)

Upvotes: 5

Related Questions