使用Scanner读取并比较每行的最后一个标记

时间:2014-09-21 16:36:23

标签: java append token java.util.scanner

我有一个正在运行的代码,它逐行读取csv文件,并在每行附加新信息。但我需要比较每一行的最后一个标记。如果最后一个令牌不等于前一行的最后一个令牌,我想将附加的前导标签增加1。

或者让事情更容易理解。 String'标签' =该行的最后一个标记。

    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

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:2)

至于,我能够理解你想要提取每行的最后部分。

例如:

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函数

Read about split function

所以你可以做以下

    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

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

警告:未经过测试的代码