簡體   English   中英

如何比較文本文件的每一行? java的

[英]How to compare each line of a text File? java

我有一個內容類似的文本文件,有792行:

der 17788648
und 14355959
die 10939606
Die 10480597

現在我要比較“Die”和“die”是否等於小寫。 因此,如果lowerCase中的兩個字符串相等,則將該單詞復制到lowerCase中的新文本文件中並對這些值求和。

預期產量:

der 17788648
und 14355959
die 114420203

到目前為止我有這個:

    try {
        BufferedReader bk = null;
        BufferedWriter bw = null;

        bk = new BufferedReader(new FileReader("outagain.txt"));
        bw = new BufferedWriter(new FileWriter("outagain5.txt"));

        List<String> list = new ArrayList<>();
        String s = "";
        while (s != null) {
            s = bk.readLine();
            list.add(s);
        }


        for (int k = 0; k < 793; k++) {
            String u = bk.readLine();
            if (list.contains(u.toLowerCase())) {

                //sum values?

            } else {
                bw.write(u + "\n");
            }
        }

        System.out.println(list.size());

    } catch (Exception e) {
        System.out.println("Exception caught : " + e);
    }

而不是list.add(s); ,使用list.add(s.toLowerCase()); 現在,您的代碼正在將不確定案例的行與較低行的行進行比較。

使用Java 8,讀取文件,比較,分組和收集等標准問題的最佳方法是使用流API,因為以這種方式執行此操作要簡單得多。 至少當文件只有幾KB時,就沒有問題了。 就像是:

Map<String, Integer> nameSumMap = Files.lines(Paths.get("test.txt"))
            .map(x -> x.split(" "))
            .collect(Collectors.groupingBy(x -> x[0].toLowerCase(),
                    Collectors.summingInt(x -> Integer.parseInt(x[1]))
            ));

首先,您可以使用Files.lines()讀取文件,該文件返回Stream<String> ,而不是將字符串拆分為Stream<String[]> ,最后您可以使用groupingBy()summingInt()函數按數組的第一個元素分組,按第二個元素求和。

如果您不想使用流API,您還可以創建HashMap並在循環中手動進行求和。

String類有一個equalIgnoreCase方法,您可以使用它來比較兩個字符串,無論大小寫如何。 所以:

String var1 = "Die";
String var2 = "die";

System.out.println(var1.equalsIgnoreCase(var2));

將打印為TRUE。

如果我的問題是正確的,你想知道如何從文件中獲取前綴,比較它,獲取它后面的值並為每個前綴求它們。 那是對的嗎?

您可以使用正則表達式單獨獲取前綴和值。 然后,您可以使用相同的前綴匯總所有值,並將它們寫入每個文件的文件中。

如果您不熟悉正則表達式,此鏈接可以幫助您:

在tutorialpoint.com上的正則表達式

vogella.com上的正則表達式

對於其他教程,只需掃描谷歌“java regex”或類似的標簽。

如果你不想在大寫和小寫字符串之間有所不同,只需將它們全部轉換為低/高,然后再比較它們@spork已經解釋過。

使用HashMap跟蹤唯一字段。 在你做一個看跌期權之前,先看看價值是否已存在。 如果是,則將舊值與新值相加並再次將其放入(這將替換具有相同鍵的舊行)

package com.foundations.framework.concurrency;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;

public class FileSummarizer {

  public static void main(String[] args) {
    HashMap<String, Long> rows = new HashMap<String, Long>();
    String line = "";
    BufferedReader reader = null;
    try {
      reader = new BufferedReader(new FileReader("data.txt"));
      while ((line = reader.readLine()) != null) {
        String[] tokens = line.split(" ");
        String key = tokens[0].toLowerCase();
        Long current = Long.parseLong(tokens[1]);

        Long previous = rows.get(key);
        if(previous != null){
          current += previous;
        }
        rows.put(key, current);
      }
    }
    catch (IOException e) {
      e.printStackTrace();
    }
    finally {
      try {
        reader.close();
        Iterator<String> iterator = rows.keySet().iterator();
        while (iterator.hasNext()) {
          String key = iterator.next().toString();
          String value = rows.get(key).toString();

          System.out.println(key + " " + value);
        }
      }
      catch (IOException e) {
        e.printStackTrace();
      }
    }
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM