Как я могу рассчитывать "CREATE GPL" в этом случае? - PullRequest
0 голосов
/ 30 ноября 2011

Моя БД генерирует 3000 строк для каждого процесса, и я должен посчитать некоторые значения для отчета. сгенерированный файл выглядит так:

CREATE TTL:NAME=SMO:0/TTS:0/UPL:1,BLQ=TRUE,NAND:TRUE,EBSPWRC=ADAPTIVE,EMSPWRC=ADAPTIVE
CREATE GPL,ASSLAPD=TSM:37/LPDLM:0,
CREATE GPL,ASSLAPD=TSM:38/LPDLM:5,
CREATE GPL,ASSLAPD=TSM:41/LPDLM:1,
CREATE GPL,ASSLAPD=TSM:21/LPDLM:8,
CREATE TTL:NAME=SMO:0/TTS:0/UPL:1,BLQ=FALSE,NAND:FALSE,EBSPWRC=ADAPTIVE,EMSPWRC=ADAPTIVE
CREATE GPL,ASSLAPD=TSM:37/LPDLM:4,
CREATE GPL,ASSLAPD=TSM:21/LPDLM:1,
CREATE TTL:NAME=SMO:0/TTS:0/UPL:1,BLQ=TRUE,NAND:TRUE,EBSPWRC=ADAPTIVE,EMSPWRC=ADAPTIVE
CREATE GPL,ASSLAPD=TSM:38/LPDLM:1,
CREATE GPL,ASSLAPD=TSM:41/LPDLM:1,
CREATE GPL,ASSLAPD=TSM:21/LPDLM:7,

На самом деле я хочу сосчитать CREATE GPL, если BLQ и NAND истинны, Также я написал этот метод, который читает файл построчно:

public void getGPLCount(File f) throws Exception { 
    BufferedReader br = new BufferedReader(new FileReader(f));
    String line;
    while ((line = br.readLine()) != null) {
        if (line.startsWith("CREATE TTL:NAME=") && line.contains("BLQ=TRUE") && line.contains("NAND:TRUE"))
        //___//
    }
}

спасибо за вашу помощь ...

Ответы [ 4 ]

1 голос
/ 30 ноября 2011

Похоже, что ответ Томаса близок, но неправильно понял, что вы хотели. Я просто изменяю его фрагмент.

Примерно так:

int counter = 0;
boolean countLines = false;
while ((line = br.readLine()) != null) {
  if (line.startsWith("CREATE TTL:NAME=") && line.contains("BLQ=TRUE") && line.contains("NAND:TRUE")) {
    countLines = true;
  } else if (line.startsWith("CREATE TTL:NAME=") && !(line.contains("BLQ=TRUE") || line.contains("NAND:TRUE"))){
    countLines = false;
  } else if( line.startsWith("CREATE GPL") && countLines )  {
    counter++;
  }
}

Так что начните считать каждый раз, когда мы получим ОБА BLQ = true И Nand = true, и остановим счетчик, если получим строку TTL, пропускающую одну (или обе) из них. Это логика, которую вы хотите?

UPDATE:

Решение Мэтью тоже верно, но в псевдокоде. Перевод на Java:

int counter = 0;
boolean countLines = false;
while ((line = br.readLine()) != null) {
  // test for TTL line
  if (line.startsWith("CREATE TTL:NAME=")) { 
    countLines = (line.contains("BLQ=TRUE") && line.contains("NAND:TRUE"))
  // if TTL told us to count and it's a GPL line
  } else if(countLines && line.startsWith("CREATE GPL"))  {
    counter++;
  }
}

Его ответ чище, потому что он не дублирует startsWith("CREATE TTL:NAME="), как я. В свою защиту я пытался привести вам рабочий пример Java, и Томас был очень близок к тому, что вы хотели.

1 голос
/ 30 ноября 2011

Ну, вы можете установить какой-либо флаг в значение true, когда вы встретите строку с BLQ и NAND, установить его в значение false, если вы встретите строку без BLQ, NAND или CREATE GPL, и считать, еслистрока начинается с CREATE GPL и флаг имеет значение true.

Примерно так:

int counter = 0;
boolean countLines = false;
while ((line = br.readLine()) != null) {
  if (line.startsWith("CREATE TTL:NAME=") && line.contains("BLQ=TRUE") && line.contains("NAND:TRUE")) {
    countLines = true;
  } else if( line.startsWith("CREATE GPL") && countLines )  {
    counter++;
  } else {
    countLines = false;
  }
}
1 голос
/ 30 ноября 2011

Полагаю, вам нужно посчитать каждый блок после того, как условие выполнено мной отдельно.

Ты почти там:

public List<Integer> getGPLCount(File f) throws Exception { 
    BufferedReader br = new BufferedReader(new FileReader(f));
    String line;
    List<Integer> result = new ArrayList<Integer>();
    int count = 0;

    boolean counting = false; // are we counting in this iteration
    while ((line = br.readLine()) != null) {
        if (!line.startsWith("CREATE GPL")) { //BLOCK DELIMITER
            if (counting) { //WE WERE COUNTING UNTIL NOW, SO WE'RE ADDING THE COUNTER TO THE RESULT LIST AND STOP COUNTING 
                result.add(count);
                count = 0;
                counting = false;
            }
            if (line.startsWith("CREATE TTL:NAME=") && line.contains("BLQ=TRUE") && line.contains("NAND:TRUE")) {//WE START COUNTING

                counting = true;
            } 
        } else { // WE'RE INSIDE THE BLOCK, SO IF WE'RE COUNTING, WE COUNT
            if (counting) {
                ++count;
            }
        }

    }
if (counting) { //TAKE CARE OF WHAT'S LEFT
    result.add(count);

}

    br.close();
    return result;
} 

Если вам нужно сосчитать все строки, просто удалите список результатов и все ссылки и не повторную инициализацию счетчика.

1 голос
/ 30 ноября 2011

В псевдокоде:

public void getGPLCount(File f) throws Exception { 
    for each line {
        if (line is a TTL line) {
            countIt = (if BLQ && NAND);
        } else {  
            if (countIt && is GPL line) {
                // we count it, increment count
            }
        }
    }

    System.out.println("count=" + count);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...