首页 > 解决方案 > OCR 购买收据中的字符串替换

问题描述

我拥有的是 Google 文档中的 OCR 沃尔玛收据(沃尔玛允许您通过电子邮件向自己发送收据的.jpg版本,并且可以使用 Google Docs 打开此图像,在此期间它会应用 OCR 来提取文本。结果非常好,几乎没有错误。)

这是来自 OCR 的实际收据的链接: https ://docs.google.com/document/d/1zSV09UGajna4DPtrHUrB6F82NugpYjaftMjomoKVXpE/edit?usp=sharing

我使用 Google Docs 对数百张沃尔玛收据进行了 OCR。OCR 处理的文档存在一些格式问题,因此我编写了一些代码来帮助对其进行规范化,作为将所有收据放入数据库的更大目标的一部分。

虽然我能够解决许多格式替换问题,但我一直试图用制表符替换“TAX 1”和“TAX 2”之后的百分号,这样我就可以按下“TAX 2”进入新行。我注意到该%符号后面总是跟一个换行符,然后是下一行的税的实际数值(对于“TAX 1”和“TAX 2”):

示例 OCR 文本:

SUBTOTAL 126.61 TAX 1 6.750 %
7.78 TAX 2 2.000 %
0.23 TOTAL 134.62

所需的输出文本:

SUBTOTAL    126.61 
TAX 1 6.750 %   7.78
TAX 2 2.000 %   0.23
TOTAL   134.62

客观的:

我可以使用 Google Docs UI 中的 CTRL-F“查找和替换”菜单执行此操作,使用正则表达式选项没有任何问题,但我无法编写应用程序脚本函数来执行相同操作。我到处搜索。我意识到 GAS 中的 RegEx 是有限的。但我不知道这是否是我的问题以及可能的解决方法。同样,我对 RegEx 的了解还不够,无法知道 GAS 支持的受限版本是否不是我问题的原因(例如,我是否忽略了某些东西)。


这是我用于格式化的代码摘录:

var body = DocumentApp.getActiveDocument().getBody();
/**
 * other formatting stuff
 */

//Find SUBTOTAL, remove the space before SUBTOTAL and move it down one line.
body.replaceText(' SUBTOTAL', '\n\nSUBTOTAL\t');

//Find TAX 1, remove the space before TAX 1 and move it down one line.
body.replaceText(' TAX 1', '\nTAX 1\t');

//Find TAX 2, remove the space before TAX 2 and move it down one line.
body.replaceText(' TAX 2', '\nTAX 2\t');

//Find TOTAL, replace it.
body.replaceText('TOTAL', '\nTOTAL\t');

//Find PERCENT SIGN AND ADD A NEWLINE AFTER IT, replace it all with a tab character.
body.replaceText("[ %\n]","\t");

前 4 个替换效果很好。它的最后一个(百分号)不起作用。我试图像这样逃避那个百分号:

body.replaceText("[ \%\n]","\t");

body.replaceText("[ \\%\n]","\t");

我试图像这样删除大括号:

body.replaceText(" \%\n","\t");

body.replaceText(" \\%\n","\t");

但坦率地说,每个都给出了不同的结果——严重地弄乱了整个收据文本。

所以百分号是问题所在——我认为。

如何修复“TAX 1”和“TAX 2”行的格式?


全文 OCR 收据示例:https ://docs.google.com/document/d/1zSV09UGajna4DPtrHUrB6F82NugpYjaftMjomoKVXpE/edit?usp=sharing

标签: google-apps-scriptocrgoogle-docstext-manipulation

解决方案


您想将共享文档的文本替换为您想要的值。您想要的值可以通过我的评论中的脚本检索。如果我的理解是正确的,那又如何呢?

在我评论的示例脚本中,整个文本被检索并替换为您想要的值。当这种情况反映到 Document 时,这个示例脚本怎么样?当您使用此脚本时,请执行以下操作。

  1. 打开共享文档。
  2. 打开脚本编辑器。
  3. 将示例脚本复制并粘贴到脚本编辑器。
  4. 运行 myFunction()。
  5. 授权范围。
  6. 请参阅文档。

示例脚本:

function myFunction() {
  var body = DocumentApp.getActiveDocument().getBody();
  var newText = body.getText()
    .match(/(SUBTOTAL[\s\S]+?)VISA/)[1]
    .replace(/TAX/g, "\nTAX")
    .replace(/ TOTAL/g, "\nTOTAL\t")
    .replace(/%\n/g, "%\t");
  body.clear();
  body.setText(newText);
}

如果这不是你想要的,我很抱歉。


推荐阅读