Как я могу посчитать эти значения? - PullRequest
1 голос
/ 27 ноября 2011

У меня есть БД, которая обычно генерирует файл с 3000 строками, на самом деле я хочу посчитать количество LAYERID (s)

Файл моей БД выглядит так:

CREATE TRMD=GFT,LAYID=LY_00,USFGN=DISABLED;
CREATE BUTYP=ACB8T,RAAT=FALSE,GBPATH=AAP4,GTXT=12;
CREATE TRMD=GFT,LAYID=LY_00,USFGN=DISABLED;
CREATE TRMD=GFT,LAYID=LY_01,USFGN=DISABLED;
CREATE TRMD=GFT,LAYID=LY_01,USFGN=DISABLED;
CREATE TRMD=GFT,LAYID=LY_02,USFGN=DISABLED;
CREATE BUTYP=ACB9T,RAAT=TRUE,GBPATH=AAP4,GTXT=32;
CREATE TRMD=GFT,LAYID=LY_00,USFGN=DISABLED;
CREATE TRMD=GFT,LAYID=LY_01,USFGN=DISABLED;
CREATE TRMD=GFT,LAYID=LY_02,USFGN=DISABLED;
CREATE TRMD=GFT,LAYID=LY_03,USFGN=DISABLED;
CREATE TRMD=GFT,LAYID=LY_03,USFGN=DISABLED;
CREATE BUTYP=ACB2T,RAAT=TRUE,GBPATH=AAP4,GTXT=1;
CREATE TRMD=GFT,LAYID=LY_00,USFGN=DISABLED;
CREATE BUTYP=ACB8T,RAAT=FALSE,GBPATH=AAP4,GTXT=2;
CREATE TRMD=GFT,LAYID=LY_00,USFGN=DISABLED;
CREATE BUTYP=ACB8T,RAAT=TRUE,GBPATH=AAP4,GTXT=3;

если у нас просто есть "LAYID=LY_00" (как в первой строке), мы должны его игнорировать, но если под "LAYID=LY_00" должно быть "LAYID=LY_01 и ..." (как в третьей строке), мы должны считать "LAYID=LY_00" и другие слои слоя, например, от строки 3 до строки 6 мы имеем 4 слоя

LAYID=LY_00
LAYID=LY_01
LAYID=LY_01
LAYID=LY_02

Итак, количество равно 4, и если мы хотим подсчитать их все, у нас есть 9, как я уже говорил, если у нас просто есть

LAYID = LY_00 схожая линия 1, мы ее игнорируем.

Также я написал этот метод для чтения построчно:

public void execToken(File f) throws Exception {
        BufferedReader br = new BufferedReader(new FileReader(f));
        String line;
        while ((line = br.readLine()) != null) {
            StringTokenizer strt = new StringTokenizer(line, ";");
            while (strt.hasMoreTokens()) {
                String token = strt.nextToken();
                layerSupport(token);
            }
        }
    }

и, я знаю, что приведенный ниже метод еще не верен и не завершен, но он может быть полезен для вас

public void layerSupport(String token){
        if(token.startsWith("CREATE TRMD") && !token.contains("LAYID=LY_00"))
            System.out.println(token) ;

    }   

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

Ответы [ 2 ]

1 голос
/ 27 ноября 2011
public int execToken(File f) throws Exception
{
    BufferedReader br = new BufferedReader(new FileReader(f));
    String line;
    int count = 0;
    Pattern layID = Pattern.compile("LAYID=LY_\\d+");
    Matcher matcher = null;
    boolean isSingle = true;
    while ((line = br.readLine()) != null)
    {
        if(line.contains("LAYID=LY_00"))
        {
            isSingle = false;
            continue;
        }
        matcher = layID.matcher(line);
        if(matcher.find())
        {
            count++;
            if(!isSingle)
                count++;
        }

        isSingle = true;
    }
    return count;
}

try this.it запоминает, содержит ли предыдущая строка LAYID=LY_00, и увеличивает ли счетчик дважды на следующей итерации, если было найдено LAYID=LY_<digits> и isSingle равно false.

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

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

public int execToken(File f) throws Exception {
    BufferedReader br = new BufferedReader(new FileReader(f));
    int count = 0;
    String line;
    String previousLine = ""; 
    while ((line = br.readLine()) != null) {
        if (line.startsWith("CREATE TRMD")) {
            if (!previousLine.isEmpty()) {
                count += (previousLine.contains("LAYID=LY_00") ? 2 : 1);
            }
            previousLine = line;
        } else {
            previousLine = "";
        }
    }

    return count;
}

Не тестировалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...