簡體   English   中英

使用掃描儀讀取並比較每行的最后一個令牌

[英]Read and compare last token of each line using Scanner

我有一個正在運行的代碼,它逐行讀取一個csv文件,並在每行后面附加新信息。 但是我需要比較每行的最后一個標記。 如果最后一個標記不等於上一行的最后一個標記,我想將附加的前導標簽加1。

或者使事情更容易理解。 字符串'label'=該行的最后一個標記。

    StringBuffer sb = new StringBuffer();
    BufferedReader br = new BufferedReader(new FileReader(filename));

    String line = br.readLine();
    Scanner scanner;

    while (line != null) {
        sb.append(label);
        int indexCount = 1;
        scanner = new Scanner(line);
        scanner.useDelimiter(",");

        while (scanner.hasNext()) {

            sb.append(" " + scanner.next() + ":" + indexCount);

        }
        sb.append(System.getProperty("line.separator"));
        line = br.readLine();
    }

我當前的輸出是這樣的:

1 0.24887:1 0.64811:1 0.5987:1 0.39418:1 0.96313:1 0.92772:1 1:1
1 0.59092:1 0.66222:1 0.6655:1 0.45021:1 0.87868:1 0.92897:1 1:1
1 0.67556:1 0.66291:1 0.43898:1 0.37441:1 0.95397:1 0.92851:1 1:1
1 0.70637:1 0.66395:1 0.859:1 0.39656:1 0.96331:1 0.93005:1 2:1
1 0.93686:1 0.66841:1 0.66013:1 0.39382:1 0.96343:1 0.92674:1 2:1
1 0.1355:1 0.66448:1 0.15662:1 0.39256:1 0.98848:1 0.90344:1 2:1

我要實現的是:

1 0.24887:1 0.64811:1 0.5987:1 0.39418:1 0.96313:1 0.92772:1 1:1
1 0.59092:1 0.66222:1 0.6655:1 0.45021:1 0.87868:1 0.92897:1 1:1
1 0.67556:1 0.66291:1 0.43898:1 0.37441:1 0.95397:1 0.92851:1 1:1
2 0.70637:1 0.66395:1 0.859:1 0.39656:1 0.96331:1 0.93005:1 2:1
2 0.93686:1 0.66841:1 0.66013:1 0.39382:1 0.96343:1 0.92674:1 2:1
2 0.1355:1 0.66448:1 0.15662:1 0.39256:1 0.98848:1 0.90344:1 2:1

我該如何實現?

到目前為止,我能夠理解您要提取每行最后一部分的內容。

例如:

1 0.24887:1 0.64811:1 0.5987:1 0.39418:1 0.96313:1 0.92772:1 1:1

你想有1:1

然后那11被刺穿

我想到的唯一方法是使用split功能

了解拆分功能

因此您可以執行以下操作

    String s = "1 0.24887:1 0.64811:1 0.5987:1 0.39418:1 0.96313:1 0.92772:1 1:1";
     String[] sp = s.split(" ");
     String[] parsedLastToken = sp[sp.length-1].split(":");
     for (int i = 0; i < parsedLastToken.length; i++) {
          System.out.println(parsedLastToken[i]); 
    }

輸出:

1
1

StringBuilder對象是可變的,您可以在任何位置(包括它們的開頭)向其中插入文本。 檢查StringBuilder API,並查找insert(...)方法的許多變體。 另一個可能的解決方案:從數據的每一行創建一個對象,並為此類提供一種方法,以使對象狀態能夠正確地以視覺方式呈現。

並且為每行使用一個新的StringBuilder也將使此操作變得更加容易,然后將結果添加到主StringBuilder中。

例如:

  StringBuilder masterSb = new StringBuilder();
  BufferedReader br = new BufferedReader(new FileReader(filename));
  String line = br.readLine();
  Scanner scanner;
  while (line != null) {
     StringBuilder sb = new StringBuilder();
     // *** sb.append(label); // *** not sure what this is for
     int indexCount = 1;
     scanner = new Scanner(line);
     scanner.useDelimiter(",");
     String lastToken = "";
     while (scanner.hasNext()) {
        lastToken = scanner.next();
        sb.append(" " + lastToken + ":" + indexCount);
     }
     sb.insert(0, lastToken + " "); // **** here we pre-pend the last token  
     sb.append(System.getProperty("line.separator"));
     line = br.readLine();
     scanner.close(); // ***** don't forget to close your Scanner
     masterSb.append(sb.toString());  // ***** add line to master SB
  }

警告:未經測試的代碼

暫無
暫無

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

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