【问题标题】:Compare two Unicode files and write output in third file比较两个 Unicode 文件并将输出写入第三个文件
【发布时间】:2017-12-01 18:02:44
【问题描述】:

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

我在 Ubuntu 中尝试过 diff 命令。但它既不适合乌尔都语,也不提供所需的结果。

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

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

示例输入文件一:

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

这个描述既精致又准确,他主要只是在

示例输入文件二:

因此,最能定义绅士的是,他是一个从不感染痛苦的人

这个描述既精致又准确,他主要只是在

要求输出:

几乎 => 大多数

说 => 躺着

造成 => 感染

精炼 => 精炼

作为 =>

占用=占用

任何可以为我解决问题的脚本/代码/软件或命令将不胜感激。我知道 Java,也有 Ubuntu 16.10Windows 10

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

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

【问题讨论】:

  • 这出奇的复杂,如果每一行的长度都相同,并且单词匹配,那将是微不足道的。没有一些话……没那么容易。如果有a b c da e d 作为行,它会显示b c => d,还是b => e, c =>
  • diffchecker.com/diff 这个网站就是这样工作的。虽然它不知道单词是否缺席。逻辑可能类似于词库之后和之前。

标签: java string ubuntu file-handling


【解决方案1】:

这是我整理的一个快速算法

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

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);

在本例中,它打印“[a few => maybe many]”(列表中的 [])

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

【讨论】:

  • 为什么有些行打印-1?
  • 什么在线?如果有不同的文本,则应始终在该行中有一个“=>”
  • 用乌尔都语串起来。我想你不会明白的。它在某些线路上做得很好。但对于某些行,它只是打印 -1;
  • 行有-1吗?你的代码的其他部分可以打印-1吗?它只是 -1 没有任何其他间距或字符吗?
  • string lineb =“کواپنهاسلاسمةیںرساتیاکهکهرسالماریکیوقرایلاهورکریایکاسورقریایشاستانسیوالےاستانههوالےےومپاستانمناداساستامسلملیکا” string linea =“ویاینیاسلاسمههلههاتیاکهکهرسالاستیمایکیوقراریایکاسورفیوالةاستانسیوالةاستانسنسیاستانبناسافاستانبنازلملیگءےانبنازلملیگءےانبنالملیگیگگانههققققققققققق
猜你喜欢
  • 2014-05-01
  • 1970-01-01
  • 2021-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-07
  • 1970-01-01
  • 2021-10-19
相关资源
最近更新 更多