繁体   English   中英

如何将5个变量的块循环到ArrayList中-块多次出现不同的值

[英]How to loop block of 5 variables into ArrayList - block occurs with different values multiple times

我需要将日志文件解析为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/3 / 2015 4:06:14 PM至2/3/2015 4:06:44 PM 0%总覆盖率。 找不到匹配的基础数据。 流动站文件:AA-123-12345-SP2.SSF当地时间:2014/2/17 5:51:01 PM至2/1 7/2014 6:18:57 PM guug04914003.zip 100%总覆盖率4% guug04914022.zip流浪者文件的100%覆盖率:AA-123-12345-SP3.SSF当地时间:2014/2/17 9:53:40 PM到2014/2/17 10:45:59 PM 100%总覆盖率100 guug04914044.zip的%覆盖率

注意:无法识别行结尾: 实际日志文件格式

我可以找到的最接近日志文件编码的匹配项是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中吗?

非常感谢!!

所以,我想通了。 :)是的,我。

我之前的代码将所有正则表达式匹配项添加到一个变量中(效果很好!),然后将该变量添加到ArrayList中,最后尝试将这些ArrayLists添加到ArrayLists的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]]

我仍然需要清理条目以删除多余的行,但要发布。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM