Search code examples
javaarraysregexparsingbufferedreader

JAVA- Read integers from txt file and compute integers


I need some help with the code below. What I'm trying to do is to write a program that reads in the file and computes the average grade and prints it out. I've tried several methods, like parsing the text file into parallel arrays, but I run into the problem of having the % character at the end of the grades. The program below is meant to add integers up too but the output is "No numbers found."

This is a clip of the text file (the whole file is 14 lines of similar input):

Arthur Albert,74% 
Melissa Hay,72%
William Jones,85%
Rachel Lee,68%
Joshua Planner,75%
Jennifer Ranger,76%

This is what I have so far:

final static String filename = "filesrc.txt";

public static void main(String[] args) throws IOException {

          Scanner scan = null;
          File f = new File(filename);
          try {
             scan = new Scanner(f);
          } catch (FileNotFoundException e) {
             System.out.println("File not found.");
             System.exit(0);
          }

          int total = 0;
          boolean foundInts = false; //flag to see if there are any integers

          while (scan.hasNextLine()) { //Note change
             String currentLine = scan.nextLine();
             //split into words
             String words[] = currentLine.split(" ");

             //For each word in the line
             for(String str : words) {
                try {
                   int num = Integer.parseInt(str);
                   total += num;
                   foundInts = true;
                   System.out.println("Found: " + num);
                }catch(NumberFormatException nfe) { }; //word is not an integer, do nothing
             }
          } //end while 

          if(!foundInts)
             System.out.println("No numbers found.");
          else
             System.out.println("Total: " + total);

          // close the scanner
          scan.close();
       }            
}

Any help would be much appreciated!


Solution

  • Here's the fixed code. Instead of splitting the input using

    " "
    

    you should have split it using

    ","
    

    That way when you parse the split strings you can use the substring method and parse the number portion of the input.

    For example, given the string

    Arthur Albert,74%
    

    my code will split it into Arthur ALbert and 74%. Then I can use the substring method and parse the first two characters of 74%, which will give me 74.

    I wrote the code in a way so that it can handle any number between 0 and 999, and added comments when I made additions that you didn't already have. If you still have any questions however, don't be afraid to ask.

    final static String filename = "filesrc.txt";
    
    public static void main(String[] args) throws IOException {
    
              Scanner scan = null;
              File f = new File(filename);
              try {
                 scan = new Scanner(f);
              } catch (FileNotFoundException e) {
                 System.out.println("File not found.");
                 System.exit(0);
              }
    
              int total = 0;
              boolean foundInts = false; //flag to see if there are any integers
                 int successful = 0; // I did this to keep track of the number of times
                 //a grade is found so I can divide the sum by the number to get the average
    
              while (scan.hasNextLine()) { //Note change
                 String currentLine = scan.nextLine();
                 //split into words
                 String words[] = currentLine.split(",");
    
                 //For each word in the line
                 for(String str : words) {
                     System.out.println(str);
                    try {
                        int num = 0;
                        //Checks if a grade is between 0 and 9, inclusive
                        if(str.charAt(1) == '%') {
                            num = Integer.parseInt(str.substring(0,1));
                            successful++;
                            total += num;
                           foundInts = true;
                           System.out.println("Found: " + num);
                        }
                        //Checks if a grade is between 10 and 99, inclusive
                        else if(str.charAt(2) == '%') {
                            num = Integer.parseInt(str.substring(0,2));
                            successful++;
                            total += num;
                           foundInts = true;
                           System.out.println("Found: " + num);
                        }
                        //Checks if a grade is 100 or above, inclusive(obviously not above 999)
                        else if(str.charAt(3) == '%') {
                            num = Integer.parseInt(str.substring(0,3));
                            successful++;
                            total += num;
                           foundInts = true;
                           System.out.println("Found: " + num);
                        }
                    }catch(NumberFormatException nfe) { }; //word is not an integer, do nothing
                 }
              } //end while 
    
              if(!foundInts)
                 System.out.println("No numbers found.");
              else
                 System.out.println("Total: " + total/successful);
    
              // close the scanner
              scan.close();
           }