免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: blackantt
打印 上一主题 下一主题

求在当前目录多个文本文件中取出包含单词列表文件中各单词的前后行 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2014-01-03 17:08 |只看该作者
本帖最后由 blackantt 于 2014-01-03 17:59 编辑

回复 9# pitonas

oh,问题又来了。

pitonas,
  第2版程序,当newword有1000个,phonetic.txt有固定的3万行左右,文本资料有300个共30M时。 程序run起来非常慢。可能要几天几夜吧。  我的电脑配置挺好的.

   我想可能是在300文本中查找,与在phonetic里匹配音标在一个程序的原因吧。  你能不能再看看,先用第1版程序产生ok.txt到硬盘,然后再与phonetic.txt文件匹配出音标。总之perl下这东西有没有可能提速。 (测试文件  在  http://mail.qq.com/cgi-bin/ftnEx ... d&code=f5227e21  )

thanks

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
12 [报告]
发表于 2014-01-05 17:54 |只看该作者
在明日{:2_172:}

回复 11# blackantt


   

论坛徽章:
0
13 [报告]
发表于 2014-01-06 16:36 |只看该作者
本帖最后由 blackantt 于 2014-01-06 17:52 编辑

回复 12# pitonas

   
谢谢。

   我在想能不能  egrep -B2 -A2 -f newword.txt *.txt > ok1.txt , 然后再用perl去做 ok1.txt 与 phonetic.txt 的vlookup 形成 ok.txt
在windows的sfu下面试了半天,steve的grep等都是有bug不能用的。最后只有gnu的grep没问题。

   这种应用是否一定要提前把txt文件放到数据库里,再从索引库里抽?那就太麻烦了。

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
14 [报告]
发表于 2014-01-09 00:17 |只看该作者
也许明天, try grep

now 试试这个脚本? 小伙伴们, 如果你不满意,请告诉我
  1. #!/usr/bin/perl

  2. # README! newword.txt 每行字後面没有空格
  3. ####################################

  4. my $Dir     = '/ok/xyz';
  5. my $save    = '/ok/abc/myok.txt';
  6. my $newword = '/ok/abc/newword.txt';
  7. my $phone   = '/ok/abc/phonetic.txt';

  8. #####################################

  9. open my $dic, $newword or die "$newword:\t$!";
  10. open my $pho, $phone   or die "$phone:\t$!";

  11. my %dic   = map { chomp; $_, [] } <$dic>;
  12. my @word  = keys %dic;
  13. my %phone = map @$_, grep $dic{ $_->[0] }, map [split], <$pho>;

  14. sub findtxt {
  15.     my $dir = shift;
  16.     map { -d $_ ? findtxt($_) : /\.txt$/ ? $_ : () } glob "$dir/*";
  17. }

  18. for my $file ( findtxt $Dir) {
  19.     open my $f, $file or die "$file:\t$!";
  20.     print $file, "\n";
  21.     my $data = do { local $/; <$f> };
  22.     $data =~ s/\s+/ /g;
  23.     my @data = split /(?<=,|\.|\?)/, $data;
  24.     for my $w (@word) {
  25.         for my $i ( 0 .. $#data ) {
  26.             if ( $data[$i] =~ /\b$w/i ) {
  27.                 my ( $u, $d ) = ( $i - 1, $i + 1 );
  28.                 $u = $i if $u < 0;
  29.                 $d = $i if $d > $#data;
  30.                 my $s = join '', @data[ $u .. $d ];
  31.                 $s =~ s/\b$w/[ $w ]/ig;
  32.                 push @{ $dic{$w} }, "$w $phone{$w}\n$s\n# $file";
  33.             }
  34.         }
  35.     }
  36. }

  37. open my $S, '>', $save or die "$save:\t$!";
  38. for my $k ( sort keys %dic ) {
  39.     next unless @{ $dic{$k} };
  40.     print $S join( "\n\n", @{ $dic{$k} } ), "\n\n";
  41. }

复制代码
回复 13# blackantt


   

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
15 [报告]
发表于 2014-01-09 08:39 |只看该作者
{:2_172:} 小伙伴们, 这个高端大气上档次。
如果你不满意,请告诉我
use grep
  1. #!/usr/bin/perl
  2. # [ grep ] VERSION
  3. ##############  EDIT  ###############

  4. my $Dir     = '/ok/xyz';
  5. my $save    = '/ok/abc/ok.txt';
  6. my $newword = '/ok/abc/newword.txt';
  7. my $phone   = '/ok/abc/phonetic.txt';

  8. #####################################

  9. open my $dic, $newword or die "$newword:\t$!";
  10. open my $pho, $phone   or die "$phone:\t$!";

  11. my %dic   = map { chomp; $_, [] } <$dic>;
  12. my @word  = keys %dic;
  13. my %phone = map @$_, grep $dic{ $_->[0] }, map [split], <$pho>;
  14. my @pbar  = qw[ \ _ / | ];
  15. my $sep   = qr/(?<=\?|\.|!)/;               

  16. for my $w (@word) {
  17.     print "\n$w\t\t";
  18.     my $t = 0;
  19.     ####################         grep       ########################
  20.     my @grep = split /--\r?\n/, `grep -r -B1 -A1 -P '\\b(?i)$w' $Dir`;
  21.    
  22.     for my $g (@grep) {
  23.         my ($file) = $g =~ /^(.*?txt)[\:\-]/;
  24.         print "\b\b\b", $pbar[ $t++ % 4 ], "  ";

  25.         $g =~ s/$file.//g;
  26.         $g =~ s/\s+/ /g;
  27.         my @data = split $sep, $g;

  28.         for my $i ( 0 .. $#data ) {
  29.             next unless $data[$i] =~ /\b$w/i;
  30.             my ( $left, $right ) = ( $i - 1, $i + 1 );
  31.             $left++  if $left < 0;
  32.             $right-- if $right > $#data;
  33.             my $s = join ' ', @data[ $left .. $right ];
  34.             $s =~ s/\b$w/[ $w ]/ig;
  35.             push @{ $dic{$w} }, "$w $phone{$w}\n$s\n# $file";
  36.         }
  37.     }
  38.     print "\b\b\bOK";
  39. }

  40. open my $S, '>', $save or die "$save:\t$!";
  41. for my $k ( sort keys %dic ) {
  42.     next unless @{ $dic{$k} };
  43.     print $S join( "\n\n", @{ $dic{$k} } ), "\n\n";
  44. }
复制代码

论坛徽章:
0
16 [报告]
发表于 2014-01-09 21:06 |只看该作者
回复 14# pitonas

pitonas,thanks

   It's very good . 第3个程序非常快,非常完美.   第4个我还没试,因为我前天下了个gnu的grep,单用 grep -B2 -A2 -f newword.txt *.txt 运行很长时间,还是没结果。我想grep快不过你的第3个程序吧。

   谢谢你,热心的pitonas


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP