1

ボタンを使用してユーザー入力をテキスト ファイルに保存しましたが、それを取得して計算を実行したいと考えています。テキスト ファイルが更新され、新しい値が追加されます。テキスト ファイルがどのように見えるかの例を次に示します。

  1. 月曜日:1 火曜日:2 水曜日:3

...等

新しい入力があると追加されるため、更新されたテキスト ファイルは次のようになります。

  1. 月曜日:1 火曜日:2 水曜日:3
  2. 月曜日 : 4 火曜日 : 1 水曜日 : 3
  3. 月曜日 : 6 火曜日 : 5 水曜日 : 6
  4. 月曜日 : 7 火曜日 : 6 水曜日 : 5

基本的に、新しい入力を以前の入力と比較したい。最新および最後の入力からすべての整数のみを取得するにはどうすればよいですか?

それともエクセルを使うべきですか?

これが私のコードです:

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)
    }
}
4

2 に答える 2

1

単に:

  1. 最後の 2 行のみを保持してファイルを読み取ります。
  2. 次に、正規表現を使用して整数を抽出します。

対応するコード:

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
    }
}

注意:これは、両方の行にまったく同じ数の整数があることを前提としています。そうでない場合は、無関係な値を比較できます。


Java 8を使用する場合の別のアプローチでは、非整数をセパレーターとして使用splitAsStream(CharSequence input)し、すべての整数を次のように抽出することに依存できます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
于 2016-11-21T09:34:06.347 に答える