在groovy中查找重复内容并整合
我想用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
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