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
)
)
我有一个旧的 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
)
)