... извините за длину ... ... и тупой код / текстовые записи. Я все еще нуб.
Мне нужно проанализировать файлы журнала дифференциальной коррекции 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:'?
Спасибо !!