Jacques Naudé Jacques Naudé - 15 days ago 6
Java Question

Java: How to read only int data from text file to perform calculation?

I use a button to save user input to a text file and now i want to retrieve it to do a calculation.
The text file is gets updated and new values are added.
Here is an e.g of how the text file looks:


  1. monday : 1 tuesday: 2 wednessday: 3



...etc

When there is a new input it will be added, so
the updated text file looks like this:


  1. monday : 1 tuesday: 2 wednessday: 3

  2. monday : 4 tuesday: 1 wednessday: 3

  3. monday : 6 tuesday: 5 wednessday: 6

  4. monday : 7 tuesday: 6 wednessday: 5



Basically i want to compare the new input with the previous input.
How do I only retrieve all the integers from the latest and last input?

or should i rather use excel?

Here is my code:

try (
InputStream fs = new FileInputStream("data.txt");
// not sure how to use the Charset.forname
InputStreamReader isr = new InputStreamReader(fs, Charset.forName("UTF-8"));
BufferedReader br = new BufferedReader(isr)) {
for (String line1 = br.readLine(); line1 != null; line = br.readLine()) {
comp = line1 - line2; //line1 being current line(4) and line2 being the previous(3)
}
}

Answer

Simply:

  1. Read your file by keeping only the 2 last lines,
  2. Then using a regular expression extract the integers.

The corresponding code:

try (
    InputStream fs = new FileInputStream("data.txt");
    InputStreamReader isr = new InputStreamReader(fs, StandardCharsets.UTF_8);
    BufferedReader br = new BufferedReader(isr)) {
    // Previous line
    String prev = null;
    // Last line
    String last = null;
    String line;
    while ((line = br.readLine()) != null) {
        prev = last;
        last = line;
    }
    // Pattern used to extract the integers
    Pattern pattern = Pattern.compile("\\d+");
    // Matcher for the previous line
    Matcher matcher1 = pattern.matcher(prev);
    // Matcher for the last line
    Matcher matcher2 = pattern.matcher(last);
    // Iterate as long as we have a match in both lines
    while (matcher1.find() && matcher2.find()) {
        // Value of previous line
        int val1 = Integer.valueOf(matcher1.group());
        // Value of last line
        int val2 = Integer.valueOf(matcher2.group());
        // Do something here
    }
}

NB: This assume that we have the exact same number of integers in both lines, otherwise you could compare unrelated values.


Another approach in case you use Java 8, you could use non integers as separator then rely on splitAsStream(CharSequence input) to extract all your integers as a List:

...
// Non integers as a separators
Pattern pattern = Pattern.compile("\\D+");
// List of extracted integers in previous line
List<Integer> previous = pattern.splitAsStream(prev)
    .filter(s -> !s.isEmpty())
    .map(Integer::valueOf)
    .collect(Collectors.toList());
// List of extracted integers in last line
List<Integer> current = pattern.splitAsStream(last)
    .filter(s -> !s.isEmpty())
    .map(Integer::valueOf)
    .collect(Collectors.toList());
// Do something here