在php中使用pcre抓取Oracle文本文件

在php中使用pcre抓取Oracle文本文件,php,regex,screen-scraping,pcre,Php,Regex,Screen Scraping,Pcre,我想抓取一个文本文件,它是Oracle AP的输出。我没有访问Oracle的权限,但需要帮助查找bug,并将文本文件与其他系统的两个csv文件进行比较。将csv文件导入数据库不是问题,但我正在努力处理这个文本文件 文本文件分为两部分。成功导入的内容和拒绝的内容。每个列都有Oracle在创建报告时设置的特定宽度。它们不会更改列宽的设置。如果列的内容超过了宽度,它只会在下面的行上继续。导入和拒绝的列不是100%相同 对于成功的导入来说很简单,因为每一行都有一个版本,但是被拒绝的一行可能有多个行,原因

我想抓取一个文本文件,它是Oracle AP的输出。我没有访问Oracle的权限,但需要帮助查找bug,并将文本文件与其他系统的两个csv文件进行比较。将csv文件导入数据库不是问题,但我正在努力处理这个文本文件

文本文件分为两部分。成功导入的内容和拒绝的内容。每个列都有Oracle在创建报告时设置的特定宽度。它们不会更改列宽的设置。如果列的内容超过了宽度,它只会在下面的行上继续。导入和拒绝的列不是100%相同

对于成功的导入来说很简单,因为每一行都有一个版本,但是被拒绝的一行可能有多个行,原因不同

由于明显的原因,导入文件会被缩短和模糊,因为它可能有几千行。最好在没有换行的文本编辑器中查看。我无法在论坛编辑器中使用blockquote或代码示例使其在论坛中看起来更好,因此请从下面的链接查看/复制它

我正在regex101.com上展示成功的

Regex找到导入的(我相信它会更好,但它可以工作,这对我来说已经足够好了):

然而,由于这些变化,我正在与被拒绝的人斗争

  • 如果不导入的原因(列)不止一个,则发票编号重复
  • 缺少供应商编号和供应商名称(始终成对显示)
这就是我到目前为止对那些被拒绝的人所做的

Regex发现被拒绝:

^\s(\d+)\s+([\D]{2,})(\d+)\s+(\d{1,2}-[a-zA-Z]{3}-\d{2})\s+(\w+)\s+(-?[\w]{1,}\.?\d+)\s+
显然,我的regex for rejected并不是最终结果。现在是垃圾。它甚至会勉强成功地排成一行

我的问题是:

  • 是否可以只使用一个正则表达式来捕捉上述要点中提到的变化?请举例说明
  • 是否可以获取列的单词包装部分?请举例说明
我试图理解关于条件的PCRE文档,因为它在处理被拒绝的变体时可能会有所帮助,但到目前为止,我正在努力解决它

问候,


Bjørn

我认为在这种情况下使用正则表达式不是好方法。逐行阅读您的文件,使用固定宽度提取信息,并编写一个生成器函数来重建分布在几行上的字段。Casimir et Hippolyte,感谢您的输入。我会考虑你的建议。是的,你可能想用解包来做这样的事情
^\s(\d+)\s+([\D]{2,})(\d+)\s+(\d{1,2}-[a-zA-Z]{3}-\d{2})\s+(\w+)\s+(-?[\w]{1,}\.?\d+)\s+