在groovy中查找重复内容并整合

在groovy中查找重复内容并整合,groovy,duplicates,text-files,Groovy,Duplicates,Text Files,我想用groovy自动编辑一个文件 例如,我有以下文本文件: 第一行只是为了你们的理解 branch ID item ID - - weight piece --- --- --- 178568305 108350 0 0 0 -1 215 215 012 178568305 102190 0 0 0

我想用groovy自动编辑一个文件

例如,我有以下文本文件: 第一行只是为了你们的理解

branch ID        item ID      -       -     weight  piece  ---    ---    ---
178568305        108350       0       0       0      -1    215    215    012 
178568305        102190       0       0       0      -1     74     74    012 
178568305        102120       0       0       0      -8     35     35    012 
178568305        102190       0       0       0      -6     74     74    012 
178568305        102190       0       0       0      -6     74     74    012
178587626        108280       0       0       0      -3    189    189    012 
178587626        159550       0       0       0      -1    499    499    012 
178587626        107740       0       0       0      -4    229    229    012 
178587626        105330       0       0     -10       0    626    626    012 
178587626        102190       0       0       0      -6     74     74    012 
在第1列中,我有一个分支ID 在第2列中,我有一个项目ID 在第5列中,我有一个重量,例如克 在第6栏中,我有一些作品 第3、4、7、8和9列并不重要

在分支ID中: 从第1行到第5行、第6行和第6行到第10行,我有两个不同的分支ID

在项目ID中: 在第2行、第4行和第5行中,我始终在同一分支ID上有相同的项目ID

现在,我想将项目ID 102190和分支ID 178568305合并到一行。 但这一行中的件数或重量必须算作总数。 但请注意:在第10行中,我有与第2行或第4行相同的项目ID,但我有另一个分支ID。不允许将第10行中的重量/件与第2、4和5行合并

例如:

branch ID        item ID      -       -     weight  piece  ---    ---    ---
178568305        108350       0       0       0      -1    215    215    012 
178568305        102120       0       0       0      -8     35     35    012 
178568305        102190       0       0       0     -13     74     74    012
178587626        108280       0       0       0      -3    189    189    012 
178587626        159550       0       0       0      -1    499    499    012 
178587626        107740       0       0       0      -4    229    229    012 
178587626        105330       0       0     -10       0    626    626    012 
178587626        102190       0       0       0      -6     74     74    012 
我的输入文本文件仅用空格分隔。我的输出文本文件必须完全相同

不幸的是,我不知道如何在groovy脚本中创建它。
有人能帮忙吗?教程也很有用。我不知道逻辑脚本是否过期。

您只需要按branchId和itemId对数据进行分组,下面是一个工作代码:

def input = new File("input.txt")

def output = new File("output.txt")


PrintWriter printWriter = new PrintWriter(output)

Map<String, String[]> result = [:]

input.eachLine { currentLine, lineNumber ->

    def array = currentLine.split("  +");

    String rowId = array[0] + "_" + array[1];

    if(lineNumber == 1 ){

        result.put(rowId, array)

    }else {



        String[] rowValues = array;

        if(null != result.get(rowId)){

            String[] existingValues = result.get(rowId);

            for(int i = 0; i < existingValues.length; ++i){

                try{

                    existingValues[i] = String.valueOf( rowValues[i].toInteger() + existingValues[i].toInteger())

                }catch (NumberFormatException ex){

                    print(ex)

                }

            }


        }else{

            result.put(rowId, rowValues)

        }

        println(array)

    }


}

int maxColumnWidth = 14;

result.each { key, value ->


    for(int i = 0; i < value.length; ++i){

        if(i == 0){

            printWriter.print(value[i])

        }else{

            String v = value[i];

            while(v.length() < maxColumnWidth){

                v = " " + v;

            }

            printWriter.print(v)

        }


    }

    printWriter.println()



}

printWriter.close()
输出:

branch ID       item ID             -             -        weight         piece           ---           ---           ---
178568305        108350             0             0             0            -1           215           215           012
535704915        306570             0             0             0           -13           222           222            36
178568305        102120             0             0             0            -8            35            35           012
178587626        108280             0             0             0            -3           189           189           012
178587626        159550             0             0             0            -1           499           499           012
178587626        107740             0             0             0            -4           229           229           012
178587626        105330             0             0           -10             0           626           626           012
178587626        102190             0             0             0            -6            74            74           012

哇,太棒了。谢谢。唯一的问题是,第一行和第二行之间的空间是不同的。每个制表符在最后一个和下一个之间减少一个空格。输入:1785683051029000-1740121785683051029000-6747401200 1785683051029000-6747000-6747001217858762610828000-3189189012输出:178568305102019000-17474012357136610 20438000-121481481482417858762610828000-31891890120。但我很抱歉。代码仍然有bug。如果您使用10行来尝试我的第一个示例,那么输出必须是我的第二个示例。但是如果我试着用你的代码,我会在第一个单元格中得到另一个数字,并且计算结果必须是19,而不是6。
branch ID       item ID             -             -        weight         piece           ---           ---           ---
178568305        108350             0             0             0            -1           215           215           012
535704915        306570             0             0             0           -13           222           222            36
178568305        102120             0             0             0            -8            35            35           012
178587626        108280             0             0             0            -3           189           189           012
178587626        159550             0             0             0            -1           499           499           012
178587626        107740             0             0             0            -4           229           229           012
178587626        105330             0             0           -10             0           626           626           012
178587626        102190             0             0             0            -6            74            74           012