比较两个Unicode文件并在第三个文件中写入输出

时间:2017-12-01 18:02:45

标签: java string ubuntu file-handling

我有两个文件。两个文件都有相等行数(每行1000个)。我必须比较这些文件并在第三个文件中写出差异。每个并发行可能包含不同数量的字词。

我在Ubuntu中尝试过diff命令。但它既不能与乌尔都语合作,也不能提供必要的结果。

我已经尝试并更新了this java代码的已接受答案。

我不在这里发帖代码问题会变得冗长。

示例输入文件一:

因此,这几乎是一个绅士的定义,说他是一个永远不会造成痛苦的人

这个描述都是精炼的,只要它准确无误,他主要只是在

中被占用

示例输入文件二:

因此,这就是绅士的最大定义,因为他是一个永远不会感染疼痛的人

这个描述既精确又精确,因为它准确无误。他主要仅仅占据

必填项:

几乎=>最

说=>铺设

造成=>感染

refine =>精炼

as =>

占用=占用

任何可以为我做这个技巧的脚本/代码/软件或命令将不胜感激。我了解Java,还有Ubuntu 16.10Windows 10

如果是java代码,那么我知道文件处理并编写了文件编写代码。

注意:最初的文件位于乌尔都语中。所以它的Unicode。我没有发布乌尔都语,因为世界上大多数人都不理解它。我正在比较语音识别结果。文件一是输入文件,文件二是识别后的结果。

1 个答案:

答案 0 :(得分:0)

这是我放在一起的快速算法

它查找要打印的一系列不相似的单词,优先考虑类似的长度系列

List<String> output = new ArrayList<String>();
String lineA = "stuff and a few things";
String lineB = "stuff and maybe many things";

String[] a = lineA.split(" ");
String[] b = lineB.split(" ");
int counterA = 0;
int counterB = 0;

while(counterA < a.length && counterB < b.length)
{
    if(a[counterA].equals(b[counterB])) //check if next two elements are equal
    {
        counterA++;
        counterB++;
        continue;
    }

    //search from array a looking for matches in array b
    int aStart = -1;
    int aStop = -1;
    for(aStart = counterA; aStart < a.length && aStop == -1; aStart++)
        for(int i = counterB; i < b.length && aStop == -1; i++)
            if(a[aStart].equals(b[i]))
                aStop = i;
    if(aStop == -1) //no matches, select rest of both lists
    {
        aStart++; //need to inc start one extra time
        aStop = b.length;
    }

    //search from array b looking for matches in array a
    int bStart = -1;
    int bStop = -1;
    for(bStart = counterB; bStart < b.length && bStop == -1; bStart++)
        for(int i = counterA; i < a.length && bStop == -1; i++)
            if(b[bStart].equals(a[i]))
                bStop = i;
    if(bStop == -1) //no matches, select rest of both lists
    {
        bStart++; //need to inc one extra time
        bStop = a.length;
    }

    //find which one is more similar
    int aDist = Math.abs((--aStart - counterA) - (aStop - counterB)); //aStart and bStart are incremented 1 too many times
    int bDist = Math.abs((--bStart - counterB) - (bStop - counterA));

    if(aDist < bDist) //a's findings are a better match
    {
        String out = "";
        for(int i = counterA; i < aStart; i++)
            out += a[i] + " ";
        out += "=> ";
        for(int i = counterB; i < aStop; i++)
            out += b[i] + " ";
        out = out.substring(0, out.length() - 1); //remove last space
        output.add(out);
        counterA = aStart;
        counterB = aStop;
    }
    else //b's findings are a better match
    {
        String out = "";
        for(int i = counterA; i < bStop; i++)
            out += a[i] + " ";
        out += "=> ";
        for(int i = counterB; i < bStart; i++)
            out += b[i] + " ";
        out = out.substring(0, out.length() - 1); //remove last space
        output.add(out);
        counterA = bStop;
        counterB = bStart;
    }
}

System.out.println(output);

在这个例子中,它打印“[几个=>多个]”(列表中的[])

在文件的每一行上运行它,它应该给出一个相当不错的差异