Board logo

标题: [求助]自动处理节目表中的数字 [打印本页]

作者: sady2009     时间: 2009-6-14 02:51    标题: [求助]自动处理节目表中的数字

有一节目表文件a.txt内容如下(更新问题):

非常感谢大家回复,问题有新的变化。
09/06/14
01:40 电视剧:承诺(3)12
13:45 电视剧:康熙微服私访记222/30
03:14 电视剧:大明奇才 (第5集)
07:25 周末剧场 连续剧 开心老爸(16)
19:35 电视剧:我的丑娘26
19:11 电视剧:清凌凌的水蓝莹莹的天Ⅱ12/36
06:18 艺术人生:展现艺术家的人生
13:03 午间剧场:我叫金三顺(19—20)
08:12 剧场:宰相刘罗锅29
20:00 剧场:金婚(25——26)
13:44 剧场:情之缘21、22、23
17:45 天下故事
请求写一批处理:有集数行后边加上(第X集)X的值从行中取得。表示日期的行,已带有第X集行,没数字的行均不处理),想了很久没搞定,行数为10万行左右,要求高效,必要时可以用p+sed 等外部命令。谢谢~

[ Last edited by sady2009 on 2009-6-14 at 11:21 ]
作者: ccwan     时间: 2009-6-14 03:14
我来抛砖引玉。
s/[ \t]*$//
s/)[0-9][0-9]/& (第&集)/;s/第)/第/
s#[0-9][0-9]/.*#& (第&集)#
s#[0-9]/.*#& (第&集)#
s/集).*/集)/1
s#(第.*/.*/.*##
/:/s#/[0-9][0-9]##2;/:/s#/[0-9]##2
以上代码复制到1.txt中
在命令行输入
sed -f 1.txt a.txt

作者: jmz573515     时间: 2009-6-14 04:41

set fso=createobject("scripting.filesystemobject")
set file=fso.opentextfile("a.txt")
do while file.atendofstream<>true
        n=file.readline
        if re(n)<>"" then n=re(n)
        s=s & n & vbcrlf
loop
file.close
msgbox s
function re(a)
        set rex=new regexp
        rex.pattern="(\d{2}:\d{2}) ?电视剧(\W*)(\d{1,3})/(\d{1,3})"
        rex.global=true
        set mats=rex.execute(a)
        for each m in mats
                i=m.submatches(2):j=m.submatches(3)
                re=replace(m, i & "/" & j,"(第" & i & "集)")
        next
end function

作者: ccwan     时间: 2009-6-14 04:55
jmz573515兄,01:40 电视剧:承诺(3)12  这行没变,还有12:47 电视剧:康熙微服私访记221/30 (第21集)这是21集。
作者: jmz573515     时间: 2009-6-14 05:11
谢谢提醒,但是想了半天也没想出“电视剧:康熙微服私访记221/30 (第21集)这是21集。”这个该怎么处理  - - !
set fso=createobject("scripting.filesystemobject")
set file=fso.opentextfile("a.txt")
do while file.atendofstream<>true
        n=file.readline
        if re(n)<>"" then n=re(n)
        s=s & n & vbcrlf
loop
file.close
msgbox s
function re(a)
        set rex=new regexp
        rex.pattern="(\d{2}:\d{2}) ?电视剧(\W*)(\d{1,3})/(\d{1,3})|\d{2}:\d{2} ?电视剧\W*(\(\d\))(\d{1,3})"
        rex.global=true
        set mats=rex.execute(a)
        for each m in mats
                i=m.submatches(2):j=m.submatches(3)
                re=replace(m, i & "/" & j,"(第" & i & "集)")
                if m.submatches(5)<>"" then re=replace(m,m.submatches(5),"(第" & m.submatches(5) & "集)")
        next
end function

作者: slore     时间: 2009-6-14 05:21
后面的30是全集数吧。。。

所以21应该能容易得到
作者: yishanju     时间: 2009-6-14 06:14
那如果出现类似
12:47 电视剧:康熙微服私访记21/30
13:45 电视剧:康熙微服私访记22/30

没有分界符不好判断

[ Last edited by yishanju on 2009-6-14 at 06:17 ]
作者: sady2009     时间: 2009-6-14 10:52
牛人真多,非常谢谢大家的关注。

另外,还有其他情况。更新在顶楼

有些情况比较特殊。象12:47 电视剧:康熙微服私访记221/30有歧义的(是1集还是21集?)。这种情很少,可以不用考虑

再次感谢给出代码的朋友。辛苦了~

[ Last edited by sady2009 on 2009-6-14 at 11:23 ]
作者: sady2009     时间: 2009-6-15 13:06
看来这个问题还是有点难度的。要高效还要准确,难以兼顾。如果能高效点,牺牲点准确性也是可以接受的。
作者: ccwan     时间: 2009-6-15 22:12
在处理文本方面,本就没有通用的代码,都是有针对性的,或说是局限性。
下面是1.txt内容,很懒,就不再简化了,不过效率还是不错的。
s/[ \t]*$/%/
s/)[0-9][0-9]/& (第&集)/;s/第)/第/
s#[0-9][0-9]/.*#& (第&集)#
s#[0-9]/.*#& (第&集)#
s/集).*/集)/1
s#(第.*/.*/.*##
/:/s#/[0-9][0-9]##2;/:/s#/[0-9]##2
/、/s/..、..、../& (第&/;s/、..、..%$/集)/
s/(.*)/& (第&集)/;s/第(/第/;s/)集/集/;s/—..集/集/
/——/s/(.*/& (第&集/;s/——..)%集/集)/;s/第(/第/
s/%//
/:/s/[0-9][0-9]$/& (第&集)/
s/%//