Выяснение самых популярных запросов
Ссылка с commnad
select * from sys.dm_exec_query_stats
order by execution_count desc
Преобразуйте вашу подстроку в объект NSData
и выполните поиск этих байтов в большем NSData
с использованием rangeOfData: options: range:
. Убедитесь, что кодировки строк совпадают!
На iPhone, где это недоступно, вам, возможно, придется сделать это самостоятельно. Функция C strstr ()
даст вам указатель на первое вхождение шаблона в буфере (если ни один из них не содержит нулей!), Но не индекс. Вот' Функция sa, которая должна выполнить задание (но никаких обещаний, поскольку я не пробовал запустить ее на самом деле ...):
- (NSUInteger)indexOfData:(NSData*)needle inData:(NSData*)haystack
{
const void* needleBytes = [needle bytes];
const void* haystackBytes = [haystack bytes];
// walk the length of the buffer, looking for a byte that matches the start
// of the pattern; we can skip (|needle|-1) bytes at the end, since we can't
// have a match that's shorter than needle itself
for (NSUInteger i=0; i < [haystack length]-[needle length]+1; i++)
{
// walk needle's bytes while they still match the bytes of haystack
// starting at i; if we walk off the end of needle, we found a match
NSUInteger j=0;
while (j < [needle length] && needleBytes[j] == haystackBytes[i+j])
{
j++;
}
if (j == [needle length])
{
return i;
}
}
return NSNotFound;
}
Это выполняется в чем-то вроде O (nm), где n - буфер length, а m - размер подстроки. Он написан для работы с NSData
по двум причинам: 1) это то, что у вас есть в руках, и 2) эти объекты уже инкапсулируют как фактические байты, так и длину буфера.
Если вы используете Snow Leopard, удобный способ - это новый метод -rangeOfData: options: range: в NSData , который возвращает диапазон первого вхождения части данных. В противном случае вы можете получить доступ к содержимому NSData самостоятельно, используя его метод -bytes для выполнения собственного поиска.
У меня была такая же проблема. Я решил, что это наоборот, по сравнению с предложениями.
Сначала я переформатирую данные (предположим, что ваши NSData хранятся в var rawFile) с помощью:
NSString *ascii = [[NSString alloc] initWithData:rawFile encoding:NSAsciiStringEncoding];
Теперь вы можете легко выполнять поиск по строкам, например 'abcd' или как хотите, используя класс NSScanner и передавая строку ascii сканеру. Возможно, это не очень эффективно, но работает до тех пор, пока метод -rangeOfData не будет доступен и для iPhone.