【问题标题】:Text difference of scrolling output滚动输出的文本差异
【发布时间】:2011-05-27 06:35:15
【问题描述】:

我有从滚动输出中捕获文本的代码,我正在寻找一种算法(使用 C++/Qt)来告诉我哪些行是新的。 注意:新行只会添加到末尾。

所以在第一次捕获时,我可能有以下内容:

hello world
some more text
hello world
some text

在第二次捕获时可能有:

hello world
some text
yet more text
hello world

所以我希望算法返回我有两个新行:

yet more text
hello world

如果可能的话,如果它可以从最后一行开始并在到达已处理的行时终止,这将有助于提高性能。但我认为这可能是不可能的,因为可能有重复的行。

【问题讨论】:

  • 你自己说的,可能有重复的行。事实上,所有行都可以相等,在这种情况下,如果输入任何新内容,您现在永远不可能。您可能最好尝试处理每个新行的添加。另外,如果您因为用户输入的内容超出缓冲区的大小而错过了行怎么办?
  • 如何捕获这个滚动输出?我假设由于某种原因,您无法获得捕获的输出中的总行数。
  • 我正在截屏并应用 OCR 转换回文本。我已将滚动区域设置得足够大,不会错过任何行。

标签: c++ algorithm text


【解决方案1】:

你说它的滚动,并且你正在使用 OCR,那么你能否在滚动窗口上捕获滚动小部件的大小,并与你记录的行一起检查?

或者,您可以将 dll 挂接到生产者程序中,以便在它输出新行时发出信号吗?还是直接将其输出输入您的?

【讨论】:

  • 不幸的是,这个程序没有针对大多数方法的保护。这就是我使用 OCR 的原因
  • 滚动条也不会改变。所以这也无济于事
【解决方案2】:

对于您的特殊情况,我会考虑一个简单的基本循环内循环算法。我不认为性能真的是一个问题(不是那么多行,我也认为 OCR 是主要部分),因此该算法应该易于阅读和健壮。

一种可能的伪代码算法:

numberOfNewLines = 0
while numberOfNewLines <= numberOfTotalLines do
    compare lines 
        [1..numberOfTotalLines-numberOfNewLines] of textNew
        with lines [1+numberOfNewLines..numberOfTotalLines] of textOld
    if identical then exit while
    numberOfNewLines++
end while

只要一行不同,您就可以中断比较,但算法仍然是行数O(N^2)

然后可以输出textNew末尾的最后一个numberOfNewLines。正如评论中提到的,您当然不能检测到一些边缘情况,例如“10000 次 'ABC' 然后 1 次 'DEF'”,其中大多数行 'ABC' 将被忽略。

【讨论】:

  • 我希望只根据需要对每一行进行 OCR。我已经为我发布的解决方案做了这个。只是不确定它有多强大。
【解决方案3】:

我已经针对一些测试用例对此进行了测试,到目前为止它工作正常:

QStringList scrollDiff(const QStringList& oldLines, const QStringList& newLines)
{
    if (oldLines.empty()) {
        return newLines;
    }

    if (oldLines.size() < newLines.size()) {
        return newLines.mid(oldLines.size());
    }

    /*
     * Note: oldLines.size() == newLines.size()
     */
    int i;
    for (i = 0; i < oldLines.size() && oldLines[i] == newLines[i]; ++i);

    if (i == oldLines.size()) {
        return QStringList();
    }

    // Remove lines from oldLines that are no longer shown
    int j = oldLines.indexOf(newLines[i]);
    if (j == -1) {
        return newLines;
    }
    QStringList commonLines = oldLines.mid(j - i);

    return newLines.mid(commonLines.size());
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-23
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-10
    • 2016-01-05
    相关资源
    最近更新 更多