PHP从文本

时间:2015-08-10 23:36:56

标签: php mysql text-mining

我有一个旧的Windows 95程序,可以导出没有帐号,季节性帐户以及帐号包含子帐户的数据。

然而,我能够将具有上述信息的客户信息和备注打印到pdf文件并将该文本复制到记事本;我想提取数据。

数据的顺序:1)页面标题(我不需要这些数据。)

公司名称

客户信息和备注

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

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

服务名称:阻止,阳光路线 1

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

地址: ST PETE,GA 33333 周/日 第一个星期一

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

服务电话:555-1212 服务:基本服务

Bill to: BLOCK,SUNNY 评分($): 24.00

公司名称

客户信息和备注

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

地址:1123 Sligh 条款: CASH

地址: Apt B

备注: Sunny有一只卑鄙的狗

除非狗被抬起,否则不要进入

然后它循环到下一个客户数据,依此类推。

主要标题永远不会改变,例如,姓名,路线,地址,笔记,电话。按顺序有一定数量的标题;但是,标题注意:可能需要1到16行;并且标题在整个数据中是随机的。虽然标题是有序的,但对于服务线1和第2行以及账单地址 - 第1行和第2行,地址标题为4次。

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

1 个答案:

答案 0 :(得分:2)

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

如果客户端之间没有已知/可靠的分隔符,我想不出有任何好的方法可以在没有包含下一个公司的标题内容的情况下获取注释,除非您可以执行涉及所有客户端的大查找表的操作名。

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

$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);

所以这基本上会查找“标题”并放入第一个捕获的组,然后匹配到下一个“标题”并将其放入第二个捕获组。

也许这对你来说已经足够好了,但TBH我想不出你能做的更好的事情,除非你能把你的提取改进到更好的格式。

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

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
        )

)