Katalon写一个Groovy脚本,java8利用java-diff-util实现两个文件夹对比,并将比较结果以文件为单位出力成各自的HTML文件。要求:当文件在两个文件夹中都存在时,能识别隔行数据,将两个文件有差异的数据都出力到HTML中,解析两个文件的差异数据并将有差异的字段高亮显示出来;当文件只在一个文件夹中存在的文件,将这个信息出力到HTML中
时间: 2024-03-02 07:52:18 浏览: 22
以下是Groovy脚本的实现:
```groovy
@Grab(group='com.googlecode.java-diff-utils', module='diffutils', version='1.3.0')
import difflib.DiffUtils
import difflib.Patch
import java.nio.file.Files
import java.nio.file.Path
import java.nio.file.Paths
// 比较两个文件夹中所有文件的差异
def compareFolders(Path folder1, Path folder2) {
// 获取两个文件夹中的所有文件
def files1 = Files.walk(folder1).filter { Files.isRegularFile(it) }.toList()
def files2 = Files.walk(folder2).filter { Files.isRegularFile(it) }.toList()
// 遍历文件夹1中的所有文件,查找在文件夹2中是否存在相同的文件
files1.each { file1 ->
def file2 = files2.find { it.fileName == file1.fileName }
if (file2 != null) {
// 如果文件在两个文件夹中都存在,则比较两个文件的内容
compareFiles(file1, file2)
files2.remove(file2)
} else {
// 如果文件只在一个文件夹中存在,则输出这个信息
println "File '${file1.fileName}' only exists in '${folder1.toAbsolutePath()}'"
}
}
// 遍历文件夹2中剩余的所有文件,输出这些文件只在一个文件夹中存在的信息
files2.each { file2 ->
println "File '${file2.fileName}' only exists in '${folder2.toAbsolutePath()}'"
}
}
// 比较两个文件的差异
def compareFiles(Path file1, Path file2) {
// 读取两个文件的内容
def lines1 = Files.readAllLines(file1)
def lines2 = Files.readAllLines(file2)
// 使用java-diff-utils库比较两个文件的内容
Patch patch = DiffUtils.diff(lines1, lines2)
// 生成HTML报告
def report = generateReport(patch)
// 将报告写入各自的HTML文件
def report1 = Paths.get(file1.parent.toFile(), "${file1.fileName}.html")
def report2 = Paths.get(file2.parent.toFile(), "${file2.fileName}.html")
Files.write(report1, report)
Files.write(report2, report)
}
// 生成HTML报告
def generateReport(Patch patch) {
def html = new StringBuilder()
html.append("<html><body><table>")
// 遍历所有差异块
patch.getDeltas().each { delta ->
def type = delta.getType()
def lines1 = delta.getOriginal().getLines()
def lines2 = delta.getRevised().getLines()
// 如果是插入或删除操作,则将所有行标记为有差异
if (type == Patch.DeltaType.DELETE) {
lines1.each { line ->
htmlLine(html, "-", line, "diff")
}
} else if (type == Patch.DeltaType.INSERT) {
lines2.each { line ->
htmlLine(html, "+", line, "diff")
}
} else {
// 如果是修改操作,则比较两个文件的差异行并标记为有差异
def diff = DiffUtils.diff(lines1, lines2)
diff.getDeltas().each { subDelta ->
def subLines1 = subDelta.getOriginal().getLines()
def subLines2 = subDelta.getRevised().getLines()
subLines1.eachWithIndex { line1, index ->
if (subLines2.size() > index && subLines2[index] != line1) {
htmlLine(html, " ", line1, "diff")
htmlLine(html, "+", subLines2[index], "diff")
} else {
htmlLine(html, " ", line1)
}
}
subLines2.drop(subLines1.size()).each { line2 ->
htmlLine(html, "+", line2, "diff")
}
}
}
}
html.append("</table></body></html>")
html.toString()
}
// 生成HTML表格的一行
def htmlLine(StringBuilder html, String prefix, String line, String cssClass = "") {
html.append("<tr>")
html.append("<td>$prefix</td>")
if (cssClass) {
html.append("<td class='$cssClass'>${line.encodeAsHTML()}</td>")
} else {
html.append("<td>${line.encodeAsHTML()}</td>")
}
html.append("</tr>")
}
// 测试
compareFolders(Paths.get("folder1"), Paths.get("folder2"))
```
这个脚本会比较两个文件夹中所有文件的差异,并将比较结果以文件为单位输出成各自的HTML文件。如果两个文件夹中有相同的文件,则会比较这两个文件的内容并将差异部分高亮显示。如果有文件只在一个文件夹中存在,则会输出这个信息。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)