Java: как сделать bufferedreader зацикливать входной файл и запускать блоки кода один раз - PullRequest
0 голосов
/ 03 июля 2018

... извините за длину ... ... и тупой код / ​​текстовые записи. Я все еще нуб.

Мне нужно проанализировать файлы журнала дифференциальной коррекции Trimble (пример приведен ниже), получить указанные значения и поместить их в файл .csv для проверки качества перед загрузкой в ​​Oracle. Я выбрал Java для профессионального развития, потому что это язык, используемый для разработки другого собственного программного обеспечения.

Я указываю на один файл до тех пор, пока не смогу получить правильный вывод, затем я поработаю с циклическим просмотром файловых структур.

Мое требование: прочитать журнал (.txt UTF-16LE) и получить конкретные значения из нескольких, в основном, похожих блоков текста; затем найдите дополнительные значения в последующих по большей части похожих (но отличных от первых блоков) блоках текста. Поместите эти значения в файл .csv для импорта в электронную таблицу для контроля качества для каждого файла журнала.

Значения в текстовых блоках могут различаться, но все возможные варианты известны.

Меня интересуют только первые блоки текста, банкомат. REGEX для всех интересующих меня значений приведен ниже.

import java.io.*;
import java.nio.*;
import java.util.*;
import java.util.regex.*;

public class LogParser
{
    public static void main (String[] args)throws IOException
    {
        //log file Reader init:
        File corrFile = new File("D:\\Utilities\\Development\\Java\\HPGPSLogParser\\Correct_2015-10-13_10-51.txt");
        BufferedReader corrReader = new BufferedReader(new InputStreamReader(new FileInputStream(corrFile),"UTF-16LE"));
        String corrText = "";
        String corrLine = "";
/*
NOTE: PFO diffcorr log files are encoded in UTF-16 LE
*/

        //Writer init:
        File stateCSV = new File("D:\\Utilities\\Development\\Java\\HPGPSLogParser\\MH.csv");
        BufferedWriter corrWriter = new BufferedWriter(new FileWriter(stateCSV, true));
        String fileText = "";

        //output reader variables:
        String corrOutput = "";
        String outputLine = "";

        //Management variables: ID location & specify actions:
        String roverFile = "Rover file: ";
        String procRoverFile = "Processing rover file, ";
        String carrProcess = "";
        String codeProces = "";

        //regex variables:
        Pattern fileName1 = Pattern.compile("Rover file: (?<fileName1>[A-Z]{2}-\\d{3}-\\d{5}-SP\\d\\.SSF)+");
        Pattern noBase = Pattern.compile("(?<noBase>No matching base data found)");
        Pattern totalCoverage = Pattern.compile("(?<totalCoverage>[\\d]{1,3})\\% total coverage");
        Pattern coverageBy = Pattern.compile("(?<coverageBy>[\\d]{1,3})+\\% coverage by (?<baseStation>\\b\\w+\\b\\.[zZ].*)+", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);
        Pattern carrierProcessing = Pattern.compile("Carrier processing\\.\\.\\.");
        Pattern fileName2 = Pattern.compile("Processing rover file, (?<fileName2>[A-Z]{2}-\\d{3}-\\d{5}-SP\\d\\.SSF)+ \\.\\.\\.");
        Pattern noProc = Pattern.compile("(?<noProc>No processing performed as base data does not have carrier data)");
        Pattern noCarDat = Pattern.compile("(?<noCarDat>No carrier processing performed as file has no carrier data)");
        Pattern selectedPositions = Pattern.compile("Selected (?<selectedPositions>\\d{1,6}) positions for post-processing");
        Pattern correctedPositions = Pattern.compile("Corrected (?<correctedPositions>\\d{1,6}) positions");
        Pattern correctFailed = Pattern.compile("Failed to correct (?<correctFailed>\\d{1,6}) positions");
        Pattern carrierMissingBase = Pattern.compile("(?<carrierMissingBase>\\d{1,6}) of these were due to missing base data");
        Pattern carrierInsuffSat = Pattern.compile("(?<carrierInsuffSat>\\d{1,6}) of these were due to insufficient satellites for position fix");
        Pattern codeProcessing = Pattern.compile("Code processing\\.\\.\\.");
        Pattern refGap = Pattern.compile("(?<refGap>Reference station data gap encountered: )");
        Pattern codeChose = Pattern.compile("Chose (?<codeChose>\\d{1,6}) code solutions over the carrier solutions");
        Pattern codeHighQual = Pattern.compile("(?<codeHighQual>\\d{1,6}) code solutions were of higher quality");
        Pattern filtered = Pattern.compile("Filtered out (?<filtered>\\d{1,6}) uncorrected positions");

            try(corrReader)
            {
                while ((corrLine = corrReader.readLine())!=null)
                {
                    corrText = corrLine.trim();
                    Matcher carrProcMatcher = carrierProcessing.matcher(corrText);
                    if (corrText.contains(roverFile))
                    {
                        Matcher file1Matcher = fileName1.matcher(corrText); //first order variable based on 'Rover file: fileName1'
                        if(file1Matcher.find())
                        {
                            String firstFileName = file1Matcher.group("fileName1");
                            if (corrOutput.equals(""))
                            {
                                corrOutput += firstFileName+",";
                            } else {
                                corrOutput += "\n"+firstFileName+",";
                            } //end else
                        Matcher baseMatcher = noBase.matcher(corrText);
                        if(baseMatcher.find()) 
                        {
                            String noBaseText = baseMatcher.group("noBase");
                            if(noBaseText.equals("No matching base data found"))
                            {
                                corrOutput += "TRUE"+",";
                            } else {
                                corrOutput += ",";
                            } //end else
                        } 
                        Matcher totCovMatcher = totalCoverage.matcher(corrText);
                        if(totCovMatcher.find()) 
                        {
                            String totalCovText = totCovMatcher.group("totalCoverage");
                            corrOutput += totalCovText+",";
                        }
                        Matcher covByMatcher = coverageBy.matcher(corrText);
                        if(covByMatcher.find()) 
                        {
                            String covByPct = covByMatcher.group("coverageBy");
                            String covByProvider = covByMatcher.group("baseStation");
                            corrOutput += covByPct+","+covByProvider+",";
                        }
                corrWriter.write(corrOutput);
                corrWriter.flush();
                        } // end file1Matcher if
                    } //end corrText.contains if
                } //end while loop
//              corrWriter.write(corrOutput);
                corrWriter.close();
                corrReader.close();
            } //end try corrReader

    } //end main method

} //end class

Содержимое журнала файлов журнала, которые меня интересуют, выглядит следующим образом:

-------- Детали покрытия: --------------------

Файл ровера: AA-123-12345-SP1.SSF

Местное время: 11.02.2014, 20:06 - 11.11.2014, 20:37:15

100% общего покрытия

100% покрытие по guug04314054.zip

Файл ровера: AA-321-54321-SP1.SSF

Местное время: 3/2/2015 с 16:06:14 до 3.03.2015, 16:06:44

0% общего покрытия. Не найдено подходящих базовых данных.

Файл ровера: AA-132-12354-SP2.SSF

Местное время: 17.02.2014, 17:51:01 - 17.02.2014, 18:18:57

100% общего покрытия

4% охват guug04914003.zip

100% охват guug04914022.zip

Мне нужно, чтобы мой вывод выглядел так:

AA-123-12345-SP1.SSF ,, 100100, guug04914003.zip,

или

* * АА тысяча сорок-девяти-312-12435-SP1.SSF, TRUE, 0 ,,,

Мой код просматривает входной файл несколько раз, генерируя повторяющиеся записи. Как получить одну выходную запись для каждого текстового блока 'Rover file:'?

Спасибо !!

1 Ответ

0 голосов
/ 04 июля 2018

Зацикливать файл только один раз. Читайте и собирайте данные по ходу дела. Не создавайте вывод, пока у вас нет всех данных. Когда вы увидите новую запись Rover file, запишите выходные данные (если нет первой записи) и очистите значения. Когда вы дойдете до конца, напишите вывод (если есть).

Изоляция кода в классе может упростить повторное использование логики печати. ​​

Пример:

public final class LogEntry {
    private final Pattern pattern = Pattern.compile("Rover file: (.*)" +
                                                   "|(\\d+)% total coverage" +
                                                   "|(\\d+)% coverage by (.*)");
    private String roverFile;
    private Integer totalCoverage;
    private Map<String, Integer> fileCoverage = new LinkedHashMap<>();

    public void process(BufferedReader in) throws IOException {
        for (String line; (line = in.readLine()) != null; ) {
            Matcher m = this.pattern.matcher(line);
            if (! m.matches())
                continue;
            if (m.start(1) != -1) {
                print();
                clear();
                this.roverFile = m.group(1);
            } else if (m.start(2) != -1) {
                this.totalCoverage = Integer.valueOf(m.group(2));
            } else if (m.start(3) != -1) {
                this.fileCoverage.put(m.group(4), Integer.valueOf(m.group(3)));
            }
        }
        print();
    }

    private void clear() {
        this.roverFile = null;
        this.totalCoverage = null;
        this.fileCoverage.clear();
    }

    private void print() {
        if (this.roverFile == null)
            return;
        if (this.fileCoverage.isEmpty()) {
            System.out.println(this.roverFile + "," + this.totalCoverage);
        } else {
            for (Entry<String, Integer> entry : this.fileCoverage.entrySet()) {
                System.out.println(this.roverFile + "," + this.totalCoverage + "," + entry.getValue() + "," + entry.getKey());
            }
        }
    }
}

Test

String input = "Rover file: AA-123-12345-SP1.SSF\n" +
               "Local time: 2/11/2014 8:06:30 PM to 2/11/2014 8:37:15 PM\n" +
               "100% total coverage\n" +
               "100% coverage by guug04314054.zip\n" +
               "Rover file: AA-321-54321-SP1.SSF\n" +
               "Local time: 2/3/2015 4:06:14 PM to 2/3/2015 4:06:44 PM\n" +
               "0% total coverage. No matching base data found.\n" +
               "Rover file: AA-132-12354-SP2.SSF\n" +
               "Local time: 2/17/2014 5:51:01 PM to 2/17/2014 6:18:57 PM\n" +
               "100% total coverage\n" +
               "4% coverage by guug04914003.zip\n" +
               "100% coverage by guug04914022.zip\n";
try (BufferedReader in = new BufferedReader(new StringReader(input))) {
    new LogEntry().process(in);
}

выход

AA-123-12345-SP1.SSF,100,100,guug04314054.zip
AA-321-54321-SP1.SSF,0
AA-132-12354-SP2.SSF,100,4,guug04914003.zip
AA-132-12354-SP2.SSF,100,100,guug04914022.zip
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...