PHP 从文本中提取数据

PHP extracting data from text

我有一个旧的 windows 95 程序,它导出没有帐号、季节性帐户以及帐户是否包含子帐户的数据。

但是,我能够将包含上述信息的客户信息和注释打印到 pdf 文件,并将该文本复制到记事本;我想提取数据。

数据顺序:1)第header页(我不需要这个数据。)

公司名称

客户信息和备注

2015 年 8 月 10 日星期一计算第 1 页

2) 标准标题和 3) 标题后的数据:

服务名称:街区,晴天路线:1

地址: 3354 ASPEN RD。 频率:每月

地址: ST PETE, GA 33333 Week/Day: 第一个星期一

城市州邮编:数据计划时间(HH:MM):10:00A

服务 Phone: 555-1212 服务: 基本服务

账单: BLOCK,SUNNY Rate ($): 24.00

公司名称

客户信息和备注

2015 年 8 月 10 日星期一计算第 2 页

地址: 1123 Sligh 条款:现金

地址: Apt B

备注:Sunny有一只卑鄙的狗

除非放狗,否则请勿进入

然后循环到下一个客户数据等等。

主要标题永远不会改变,例如,ser name,route,address,notes,phone。有一定数量的标题;但是,标题 notes: 可以占用 1 -16 行; header 在整个数据中是随机的。尽管标题是按顺序排列的,但服务 - 第 1 行和第 2 行以及帐单地址 - 第 1 行和第 2 行的地址都有 4 次标题。

我想为这些标题设置变量,只取它们后面的内容;提取部分通过 PHP。有办法吗?

我不认为这是一个完美的解决方案,但 FWIW,也许这对你来说已经足够了。

如果客户之间没有已知/可靠的分隔符,我想不出有什么好方法可以在不包含下一家公司的 header 内容的情况下获取注释,除非你可以做一些涉及所有客户端名称的大查找 table。

我确实有(一个丑陋的)正则表达式,它可以可靠地帮助其他东西:

$content='[the contents of your file]';
preg_match_all('~(Ser Name|Route|Address|Frequency|Week/Day|City State Zip|Sched Time \(HH:MM\)|Ser Phone|Service|Bill to|Rate \($\)|Terms|notes):\s*((?:(?!Ser Name|Route|Address|Frequency|Week/Day|City State Zip|Sched Time \(HH:MM\)|Ser Phone|Service|Bill to|Rate \($\)|Terms|notes).)+)~is',$content,$matches);

所以这基本上是寻找 "header" 并放入第一个捕获组,然后匹配下一个 "header" 并将其放入第二个捕获组。

也许这对您来说已经足够好了,但老实说,我想不出您能做的更好的事情,除非您可以将提取改进为更好的格式。

因此您的示例数据将输出:

Array
(
    [0] => Array
        (
            [0] => Ser Name: Block, Sunny 
            [1] => Route: 1


            [2] => Address: 3354 ASPEN RD. 
            [3] => Frequency: Monthly


            [4] => Address: ST PETE, GA 33333 
            [5] => Week/Day: First Monday


            [6] => City State Zip: data 
            [7] => Sched Time (HH:MM): 10:00A


            [8] => Ser Phone: 555-1212 
            [9] => Service: BASIC SERVICE


            [10] => Bill to: BLOCK,SUNNY 
            [11] => Rate ($): 24.00

Company Name

Customer Information and Notes

Computed Monday, August 10 2015 Page 2


            [12] => Address: 1123 Sligh 
            [13] => Terms: CASH


            [14] => Address: Apt B


            [15] => notes: Sunny has a mean dog
        )

    [1] => Array
        (
            [0] => Ser Name
            [1] => Route
            [2] => Address
            [3] => Frequency
            [4] => Address
            [5] => Week/Day
            [6] => City State Zip
            [7] => Sched Time (HH:MM)
            [8] => Ser Phone
            [9] => Service
            [10] => Bill to
            [11] => Rate ($)
            [12] => Address
            [13] => Terms
            [14] => Address
            [15] => notes
        )

    [2] => Array
        (
            [0] => Block, Sunny 
            [1] => 1


            [2] => 3354 ASPEN RD. 
            [3] => Monthly


            [4] => ST PETE, GA 33333 
            [5] => First Monday


            [6] => data 
            [7] => 10:00A


            [8] => 555-1212 
            [9] => BASIC SERVICE


            [10] => BLOCK,SUNNY 
            [11] => 24.00

Company Name

Customer Information and Notes

Computed Monday, August 10 2015 Page 2


            [12] => 1123 Sligh 
            [13] => CASH


            [14] => Apt B


            [15] => Sunny has a mean dog
        )

)