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:
...etc
When there is a new input it will be added, so the updated text file looks like this:
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)
}
}
Simply:
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