Лучший язык, подходящий для сканирования множества файлов по ключевому слову (вызываемому из приложения Какао)? - PullRequest
1 голос
/ 02 августа 2009

Я пишу приложение Какао для Leopard, которое, учитывая каталог текстовых файлов, будет сканировать их в поисках шаблона поиска (давайте представим, что это исходные файлы, а я просто хочу найти C-комментарии). Затем он представит результаты пользователю.

Хотя я думаю, что я, безусловно, мог бы сделать это с Какао, мне кажется, что он действительно предназначен для передачи языку сценариев. Но что будет лучше для этой задачи и почему? Я думаю о том, чтобы пойти с Руби (у меня есть книга об этом, но у меня никогда не было веской причины изучать ее слишком хорошо), но я, конечно, открыт для других (Perl, очевидно, приходит на ум). *

Вид поиска, который я буду выполнять, не слишком сложен, но я бы хотел так или иначе интегрировать его в мое приложение Cocoa.

Как мне лучше всего подойти к этому?

Ответы [ 5 ]

3 голосов
/ 02 августа 2009

Если поиск не слишком продвинут, просто сделайте это самостоятельно:

  • Сканирование каталога с использованием -[NSFileManager contentsOfDirectoryAtPath:]

  • Считайте каждый файл в строку, используя +[NSData dataWithContentsOfFile:] и -[NSString initWithData:encoding:] (обдумайте кодировку, которая вам нужна, или просто используйте MacRoman для поиска ASCII, так как вам не важно, что происходит с старшими байтами)

  • Поиск по каждой строке с использованием -[NSString rangeOfString:] или другого варианта или использование RegexKit для регулярных выражений.

Я сомневаюсь, что код будет намного сложнее, чем поддержание двух разных кусков кода на двух языках и передача данных между ними.

3 голосов
/ 02 августа 2009

Один подход мозговых мертвецов: выстрелить 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 голосов
/ 02 августа 2009

Может быть, ваш пример вымышленный, но синтаксический анализ комментариев C не является чем-то особенным в регулярных выражениях. Они выполняют достаточно хорошую работу в 90% случаев, но примеры из 10% легко представить:

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

Там нет комментариев, и любые утверждения, которые ваше регулярное выражение делает наоборот, неверны.

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

Там есть комментарий, но он намного короче, чем может показаться наскоро построенное регулярное выражение. На самом деле, есть два пути, по которым этот образец может пойти не так.

Если вы на самом деле не анализируете комментарии C, тогда, возможно, вы можете игнорировать весь этот ответ. Но если да, то вам гораздо лучше с реальной системой синтаксического анализа, такой как lex / yacc или, возможно, TDParseKit .

1 голос
/ 02 августа 2009

Нет «лучшего» языка. У всех есть компромиссы. Хотя, если все, что вы делаете - это поиск шаблонов, я сомневаюсь, что вы напишите что-нибудь лучше, чем grep или awk.

Если вы беспокоитесь о производительности и хотите написать ее самостоятельно, лучшим выбором будет C. С точки зрения языка сценариев, большинство справится хорошо (хотя, вероятно, заметно медленнее, чем в C). Лично я бы порекомендовал Tcl, поскольку он очень хорошо выполняет регулярные выражения, а его обработка Юникода для всех целей и задач полностью прозрачна - гораздо лучшая поддержка Юникода, чем, например, Python.

Ruby, python, bash тоже хороши, как и многие другие языки сценариев. С точки зрения интеграции, Tcl очень легко интегрируется с другими приложениями. Lua также легко интегрируется из того, что я слышал, хотя лично я не вижу веской причины выбирать его вместо Tcl с технической точки зрения. Lua имеет большой разум, если вы хотите выбрать «горячую» технологию.

Лично я бы избегал perl. Я думаю, что этот день пришел и ушел, хотя некоторые люди все еще клянутся этим. Я думаю, что его синтаксис немного тупой, и есть причины, по которым он имеет репутацию языка «только для записи».

0 голосов
/ 03 августа 2009

Похоже, что Spotlight API был бы подходящим вариантом. http://developer.apple.com/macosx/spotlight.html

Ваши поиски уже будут проиндексированы, и тот факт, что приложения могут предоставлять плагины, означает, что центр внимания сможет копать файлы, которые вы не могли бы иначе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...