【问题标题】:String replacement in OCR'd purchase receiptsOCR 购买收据中的字符串替换
【发布时间】:2018-07-18 21:04:26
【问题描述】:

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

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

我使用 Google 文档对数百张沃尔玛收据进行了 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

目标:

  • 每个(小计、TAX 1、TAX 2 和 TOTAL)都有一个新行。 (可行)
  • 在每个(小计、TAX 1、TAX 2 和 TOTAL)之后应该有一个制表符,以便每个数字值都是制表位。 (可行)
  • 我想用一个百分号和一个制表符替换(空格+百分号+换行符)(认为 7.78 应该“上升”一行,因为换行符被取出 (这是什么失败了)

我可以使用 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

【问题讨论】:

  • 我不确定我是否能理解你想要什么。如果这不是你想要的,请告诉我。如果你想从Example fulltext OCR'd receipt: 中检索Desired Output Text:,这个样本怎么样? var r = DocumentApp.getActiveDocument().getBody().getText().match(/(SUBTOTAL[\s\S]+?)VISA/)[1].replace(/TAX/g, "\nTAX").replace(/ TOTAL/g, "\nTOTAL\t").replace(/%\n/g, "%\t") 在此示例中,假设 Example fulltext OCR'd receipt: 在 Google 文档中。
  • 给您带来的不便,我深表歉意。我无法理解修改点,因为在我的环境中,它可以工作。我做了如下。我将Example fulltext OCR'd receipt: 复制并粘贴到了一个新的Google Document 中,脚本在Document 的容器绑定脚本中运行。在这种情况下,没有发生错误。如果我对您的情况的理解不正确,您能否提供您想要的示例输入和输出?我真的很抱歉我的英语水平不好。
  • 感谢您分享示例。当我为您的共享示例尝试脚本时,没有发生错误。我得到了像Desired Output Text: 这样的结果。我能问一下你运行脚本的流程吗?
  • 我执行了以下流程。 1. 打开共享文档。 2. 打开脚本编辑器。 3. 将脚本复制并粘贴到myFunction()。 4.在myFunction()中添加Logger.log(r)。 5. 运行myFunction()。 6. 授权范围。 7. 查看结果。
  • 成功了!谢谢!现在,我的问题是如何将变量“r”放入文本中?查看日志时可以看到更改,但实际文档中没有显示。有没有办法让它只在文档中工作?我试图删除“var r =”并将其作为对文档文本的操作运行,但没有进行任何更改(也没有产生错误)。

标签: google-apps-script ocr google-docs text-manipulation


【解决方案1】:

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

在我评论的示例脚本中,整个文本被检索并替换为您想要的值。当这种情况反映到 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);
}

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

【讨论】:

  • 太完美了!谢谢!
  • @ONDEV 欢迎。我很高兴你的问题得到了解决。也谢谢你。
猜你喜欢
  • 2013-02-21
  • 1970-01-01
  • 2012-04-26
  • 1970-01-01
  • 2010-11-20
  • 2019-12-28
  • 2019-11-08
  • 2013-05-08
  • 2020-04-30
相关资源
最近更新 更多