簡體   English   中英

如何在Java中讀取特定行

[英]How to read specific line in Java

我有一個包含這樣內容的文件

Fri Sep 19 19:16:39 UTC 2014
Test launched. Check every minute for an update
minute 9:
ec2-54-84-5-158.compute-1.amazonaws.com: Requests per second:    926.13 [#/sec] (mean)
----------------------
minute 10:
ec2-54-84-5-158.compute-1.amazonaws.com: Requests per second:    919.23 [#/sec] (mean)
----------------------
minute 11:
ec2-54-209-65-210.compute-1.amazonaws.com: Requests per second:    547.62 [#/sec] (mean)
ec2-54-84-5-158.compute-1.amazonaws.com: Requests per second: 875.14 [#/sec] (mean)
----------------------
minute 12:
ec2-54-209-65-210.compute-1.amazonaws.com: Requests per second:    862.83 [#/sec] (mean)
ec2-54-84-5-158.compute-1.amazonaws.com: Requests per second: 876.78 [#/sec] (mean)
----------------------
minute 13:
ec2-54-209-65-210.compute-1.amazonaws.com: Requests per second:    857.37 [#/sec] (mean)
ec2-54-84-5-158.compute-1.amazonaws.com: Requests per second: 880.64 [#/sec] (mean)
----------------------

它基本上保持每分鍾更新。 所以我想從這兩行“ ------------”之間的最后一個塊中獲取最后一個數據。 最終目的是求和該塊每秒的請求數。 您能指導我應用最佳邏輯嗎?

此代碼將識別每秒的請求(字段#5),並將識別當前行與包含每秒請求數的最后(最近)行的每秒請求數之差。

此代碼假定每秒請求數始終出現在以世界“分鍾”(不帶引號)開頭的行之后的行上。

    try{
        BufferedReader br = new BufferedReader(new FileReader("C:\\TEMP\\MINUTE.txt"));

        String   line;
        String[] lineFields;
        int      i;
        int      thisLine_minute;
        int      lastLine_minute;
        Double   thisLine_reqpersec;
        Double   lastLine_reqpersec;
        lastLine_minute   = 0;
        thisLine_reqpersec= 0.0;
        lastLine_reqpersec= 0.0;
        while ( (line = br.readLine()) != null) {

            lineFields = line.split("\\s+");
            System.out.printf("LINE READ: %s\n", line);
            for (i=0; i < lineFields.length; i++) {
                System.out.printf("FIELD: %d  IS: %s\n", i, lineFields[i]);
            }
            if (lineFields[0].toUpperCase().equals("MINUTE")) {
                thisLine_minute=1;
            }
            else {
                thisLine_minute=0;
            }
            try {
            if (lastLine_minute==1) {
                lastLine_reqpersec = thisLine_reqpersec;
                thisLine_reqpersec = new Double(lineFields[4]);
            }
            }
            catch (Exception excepStrToInt) {
                thisLine_reqpersec = 0.0;
            }
            System.out.printf("*** REQUESTS PER SECOND: %f\n", 
            thisLine_reqpersec);
            System.out.printf("*** REQUESTS PER SECOND: DIFFERENCE: %f\n", 
            (thisLine_reqpersec- lastLine_reqpersec));

            lastLine_minute=thisLine_minute;
        }
        br.close();
    }
    catch(Exception e){
    }

你可能會做一個分割字符串

String yourBlocks[] = yourEntireFileInString.split("----------------------");

那么你想要的塊是

yourBlocks[yourBlocks.length-2]

更進一步,您想做的是

int numberRequest,numberRequest1;
String tempNumber;
for(String myString : yourBlocks) {
    String [] splitedString = myString.split("Requests per second:");
    tempNumber="";
    for(int i = 0;i< splitedString[1].length ; i++) {
          if(Charachter.isDigit()){
               tempNumber+=splitedString[i];
          }
          if('#'==splitedString[i]){
               break;
          }
    }
    numberRequest = Integer.parseInt(tempNumber);
    tempNumber="";
    for(int i = 0;i< splitedString[3].length ; i++) {
          if(Charachter.isDigit()){
               tempNumber+=splitedString[i];
          }
          if('#'==splitedString[i]){
               break;
          }
    }
    numberRequest1 = Integer.parseInt(tempNumber);
    // use numberRequest, numberRequest1 here
}

這可能不是很有效,但是會讓您達到理想的輸出。

String result="";
BufferedReader bf = new BufferedReader(new FileReader("your_file_path"));
int dashCount=0;
String finalResult= "";
while ((result = bf.readLine()) != null) {
 if (result.length() != 0) {
    if (result.charAt(0) == ’-’) {

        dashCount=dashCount+1;
        if(dashCount==2) break;

                                                  } 
        finalResult+=result;

                          }
                                    }

因此,您正在嘗試對每個以虛線結尾的塊中的值求和,對嗎? 與其嘗試將文件分開,不如逐行讀取它,直到到達文件末尾,並對出現的任何行做出適當的反應:

  • 如果該行中包含“每秒請求數”,則解析出該值並將其添加到該塊的總和中。
  • 如果它是一行中帶有“ ---”的行,則說明此塊已完成,因此請對結果進行任何處理並將其總和重置為0,以准備開始下一個塊。
  • 如果是其他任何一行,請忽略它並閱讀下一行。

如果您希望對所有每秒的總和進行處理(例如對它們求平均值),則每次完成讀塊后都需要執行任何操作。 如果您只關心最后一個塊,則只需保存您每次​​計算的最后一個總和,覆蓋最后一個值即可; 當您點擊文件中的最后一條虛線時,您將已經計算並保存了最后一塊的總和,並且可以在其中閱讀和使用它。 但是我的直覺說,您將要使用所有值,而不僅僅是最后一個值...

暫無
暫無

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

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