我需要将日志文件解析为ArrayLists的ArrayList。正则表达式正在工作,我可以在变量或.csv输出中获得正确的结果。问题是我需要通过在条件不成立的条目中添加一个值,然后在原始行和要添加的行之间基于index [0](文件名)匹配附加值来操纵输出。 >
每个日志文件可以具有1-〜200个条目,具体取决于收集的字段输入的数量。日志文件条目是多行和可变的;但结构化,因此所有变体都是已知的(n = 18个正则表达式-并非与以下代码段都相关)。我需要能够根据其中一些变体来操纵行内容。
这意味着我需要遍历各个可能不等长的行(即整个表)以进行编辑和追加,并遍历每行(即在表下方)。因此,简单数组不能像ArrayLists一样工作。
我成功创建了一个ArrayList的ArrayList(应该将所有单独行的所有内容都放入一个ArrayList中,然后将其放入父ArrayList中)。
尝试通过移动'covArrayList = new ArrayList(covArrayList);'获得单个ArrayList;在'while((corrLine ...)'和'for(String ..)'循环之间,或者进入'if(fileMatcher.find)'块之间,每个正则表达式匹配都返回多个输出,并更改顺序,因此值可以不能每个都链接到特定的'file1Name'...
仅供参考:我正在使用JDK10。我必须重构,以便JRE 8可以运行该程序,但出于发展原因,以后想这样做。
这是我的代码的子集,它们都在main方法之内:
//arraylist of covArrayLists init:
List<List<String>> coverage = new ArrayList<>();
//coverage arrayList init:
List<String> covArrayList = new ArrayList<String>();
//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"));
//NOTE: PFO differential correction log files are encoded in UTF-16 LE
String corrText = "";
String corrLine = "";
//corrWriter init:
File stateCSV = new File("D:\\Utilities\\Development\\Java\\HPGPSLogParser\\tcov.csv");
BufferedWriter corrWriter = new BufferedWriter(new FileWriter(stateCSV, true));
String coverageOutput = "";
String processingOutput = "";
//regex variables:
//Coverage Details regex
Pattern fileName1 = Pattern.compile("Rover file: (?<fileName1>[A-Z]{2}-\\d{3}-\\d{5}-SP\\d\\.SSF)+");
String firstFileName = "";
Pattern noBase = Pattern.compile("(?<noBase>No matching base data found)");
String noBaseText = "";
Pattern totalCoverage = Pattern.compile("(?<totalCoverage>[\\d]{1,3})\\% total coverage");
String totalCovText = "";
Pattern coverageBy = Pattern.compile("(?<coverageBy>[\\d]{1,3})+\\% coverage by (?<baseStation>\\b\\w+\\b\\.[zZ].*)+", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);
String covByPct = "";
String covByProvider = "";
try(corrReader)
{
while ((corrLine = corrReader.readLine())!=null)
{
corrText = corrLine.trim();
String delim = " ";
String[] words = corrLine.split(delim);
covArrayList = new ArrayList<String>(covArrayList);
for (String s : words)
{
//Coverage details regex search begin - write to coverageOutput
Matcher file1Matcher = fileName1.matcher(corrText);
if(file1Matcher.find())
{
firstFileName = file1Matcher.group("fileName1");
covArrayList.add(firstFileName);
} //end if(file1Matcher)
Matcher baseMatcher = noBase.matcher(corrText);
if (baseMatcher.find())
{
noBaseText = baseMatcher.group("noBase");
covArrayList.add("TRUE");
} //end if(baseMatcher)
Matcher totCovMatcher = totalCoverage.matcher(corrText);
if(totCovMatcher.matches())
{
totalCovText = totCovMatcher.group("totalCoverage");
covArrayList.add(totalCovText);
} //end if(totCovMatcher)
Matcher covByMatcher = coverageBy.matcher(corrText);
if(covByMatcher.matches())
{
covByPct = covByMatcher.group("coverageBy");
covArrayList.add(covByPct);
covByProvider = covByMatcher.group("baseStation");
covArrayList.add(covByProvider);
} //end if(covByMatcher)
} //end for(String)
} //end while loop - regex searches & initial output file end
coverage.add(covArrayList);
processing.add(procArrayList);
corrWriter.write(coverage.toString());
corrWriter.flush();
outWriter.write(processing.toString());
outWriter.flush();
catch / finally块在代码中,而不是在代码段中。
以下是日志文件的摘录,其中包含本节中的三种可能的变体:
--------覆盖范围详细信息:--------------------漫游文件:AA-123-12345-SP1.SSF当地时间:2 2015年3月3日下午4:06:14至2015年2月3日 4:06:44 PM 0%的总覆盖率。找不到匹配的基础数据。流浪者 文件:AA-123-12345-SP2.SSF当地时间:2014年2月17日下午5:51:01至2/1 7/2014 6:18:57 PM 100%总覆盖率4%覆盖率 guug04914022.zip漫游器文件对guug04914003.zip的覆盖率为100%: AA-123-12345-SP3.SSF当地时间:2/17/2014 9:53:40 PM至2/17/2014 晚上10:45:59 100%总覆盖率guug04914044.zip
注意:无法识别行尾:Actual Log File format
与日志文件编码最接近的匹配是UTF-16LE,没有其他选项与日志文件的字符集/格式接近。
我需要的输出应如下所示:
注意:请假装条目之间没有多余的界限(消除空格的算法确实与我需要说明的格式有关)。
注意:当匹配“ noBase”时,将不匹配任何后续的正则表达式(来自此块)。
注意:“ covByPct”和“ baseStation”可能不会发生,或者会发生一次或两次。
[[[“ fileName1”,“ totalCoverage”,“ covByPct”,“ baseStation”]
[“ fileName1”,“ noBase”]
[“ fileName1”,“ totalCoverage”,“ covByPct”,“ baseStation”,“ covByPct”,“ baseStation”]]
最接近我需要的输出是:
[[“ fileName1”,“ totalCoverage”,“ covByPct”,“ baseStation”, “ fileName1”,“ noBase”, “ fileName1”,“ totalCoverage”,“ covByPct”,“ baseStation”,“ covByPct”,“ baseStation”]]
我是一个初学者,正在为一个超出当前技能水平的项目而工作。 :(
有人可以帮助我更正我的代码,以便将正则表达式匹配项放入日志文件中每个条目的新ArrayList中吗?
非常感谢!
答案 0 :(得分:0)
所以,我知道了。 :)是的,我。
我之前的代码会将所有正则表达式匹配项添加到一个变量中(效果很好!),然后将该变量添加到ArrayList中,最后尝试将那些ArrayList添加到ArrayLists的ArrayList中。
...所以我最终得到了ArrayList中所有值的多个副本,或者一个ArrayList中单个ArrayList中的所有值。
以下代码为找到的每个文件名初始化一个新的“ ArrayList coverageOutput”,然后将后续的正则表达式匹配项放入正确的ArrayList中;然后将每个新的ArrayList添加到ArrayLists的ArrayList中。不知道它是如何工作的,但是它是正确的。
如果有比我更聪明/更有经验的人来解释它的工作原理,我将支持您的解释,并认为您是BOMB! :)
try(corrReader)
{
while ((corrLine = corrReader.readLine())!=null)
{
corrText = corrLine.trim();
//Coverage details regex search begin - write to coverageOutput
Matcher file1Matcher = fileName1.matcher(corrText);
if(file1Matcher.find())
{
coverageOutput = new ArrayList<String>();
coverageOutput.add(file1Matcher.group("fileName1"));
coverage.add(coverageOutput);
} //end if(file1Matcher)
Matcher baseMatcher = noBase.matcher(corrText);
if (baseMatcher.find())
{
noBaseText = baseMatcher.group("noBase");
noBaseText = "noBaseData";
coverageOutput.add(noBaseText);
} //end if(baseMatcher)
Matcher totCovMatcher = totalCoverage.matcher(corrText);
if(totCovMatcher.matches())
{
totalCovText = totCovMatcher.group("totalCoverage");
coverageOutput.add(totalCovText);
} //end if(totCovMatcher)
Matcher covByMatcher = coverageBy.matcher(corrText);
if(covByMatcher.matches())
{
covByPct = covByMatcher.group("coverageBy");
covByProvider = covByMatcher.group("baseStation");
coverageOutput.add(covByPct);
coverageOutput.add(covByProvider);
} //end if(covByMatcher)
我得到的输出是所需的输出:
[[[filename1,totalCoverage,covByPct,covByProvider],[fileName1,noBaseData],[filename1,totalCoverage,covByPct,covByProvider,covByPct,covByProvider]]
我仍然需要清理条目以删除多余的行,但想发布。