代码之家  ›  专栏  ›  技术社区  ›  jbrennan

最适合扫描许多文件寻找关键字的语言(从Cocoa应用程序调用)?

  •  1
  • jbrennan  · 技术社区  · 15 年前

    我正在为Leopard编写一个Cocoa应用程序,它提供了一个文本文件目录,可以扫描它们,寻找搜索模式(假设它们是源文件,我只想找到C注释)。然后它将向用户显示结果。

    虽然我认为我当然可以用Cocoa来实现这一点,但感觉它真的是要被移交给脚本语言的。但这项任务哪个更好,为什么?我想和Ruby一起去(我有一本关于它的书,但是我从来没有充分的理由去学习它),但是我肯定对其他人开放(Perl显然会想到)。

    我将要进行的搜索并不太先进,但我想以某种方式将其集成到我的Cocoa应用程序中。

    我应该如何最好地处理这个问题?

    5 回复  |  直到 15 年前
        1
  •  3
  •   Meredith L. Patterson    15 年前

    一脑死亡法:开火 grep -l 作为一个 NSTask .

    NSTask *task = [[NSTask alloc] init];
    [task setLaunchPath: @'/bin/grep'];
    NSArray *args = [NSArray arrayWithObjects: @'-I', @'-l', searchString, @'/path/to/textfiles', nil];
    [task setArguments: args];
    NSPipe *p = [NSPipe pipe];
    [task setStandardOutput: p];
    NSFileHandle *f = [pipe fileHandleForReading];
    [task launch];
    

    然后打开您的文件句柄,读取内容,并对结果执行您喜欢的任何操作。 -I 只搜索文本文件, -l 仅返回匹配的文件名(每个文件名只显示一次)。

        2
  •  3
  •   Quinn Taylor    15 年前

    如果搜索不是很高级,那么就自己做:

    • 使用扫描目录 -[NSFileManager contentsOfDirectoryAtPath:]

    • 使用将每个文件读取到字符串中 +[NSData dataWithContentsOfFile:] -[NSString initWithData:encoding:] (考虑您需要的编码,或者使用macroman进行ASCII搜索,因为您不关心高字节字符会发生什么情况)。/

    • 使用搜索每个字符串 -[NSString rangeOfString:] 或变体,或使用 RegexKit 对于正则表达式。

    我怀疑代码比用两种语言维护两个不同的代码块和在它们之间传递数据要困难得多。

        3
  •  2
  •   Peter Hosey    15 年前

    也许您的示例是虚构的,但是解析C注释并不是正则表达式所擅长的。他们90%的时间都做得很好,但是很容易想到10%的例子:

    [myString replaceOccurrencesOfString:@"/*" withString:@"*/"];
    

    这里没有注释,并且您的正则表达式所做的任何相反的声明都是错误的。

    [myString replaceOccurrencesOfString:@"/*" withString:@"//"]; /*Step 1 of converting winged comments to C99 single-line comments*/
    

    这里有一条注释,但它比匆忙构建的正则表达式所能想到的要短得多。事实上,这个示例实际上有两种可能出错的方法。

    如果您没有真正解析C注释,那么也许您可以忽略整个答案。但是如果是这样的话,使用实际的解析系统会更好,比如lex/yacc或者 TDParseKit .

        4
  •  1
  •   Bryan Oakley    15 年前

    没有“最好”的语言。他们都有权衡。但是,如果你所做的只是寻找模式,我怀疑你会写任何比grep或awk更好的东西。

    如果你关心性能,并且想自己写它,你最好的选择是C。从脚本语言的角度来看,大多数人都会做得很好(尽管可能明显比C慢)。我个人推荐Tcl,因为它很好地实现了regex,而且它对unicode的处理是完全透明的——例如,比python更好地支持unicode。

    Ruby、python、bash和其他许多脚本语言都很好。从集成的角度来看,TCL很容易与其他应用程序集成。Lua也很容易从我所听到的内容进行整合,尽管我个人认为从技术角度来看,没有一个令人信服的理由来选择它而不是TCL。不过,如果你想选择一种“热门”技术,Lua现在有很多想法。

    就我个人而言,我会避开Perl。我想这一天来了又去了,尽管有些人仍然对它发誓。我认为它的语法有点迟钝,有理由说它是一种“只写”的语言。

        5
  •  0
  •   JimDusseau    15 年前

    看起来Spotlight API是实现这一目标的途径。 http://developer.apple.com/macosx/spotlight.html

    你的搜索已经被编入索引,应用程序可以提供插件这一事实意味着Spotlight将能够挖掘你原本无法挖掘的文件。