2010-07-09 2 views
0

Я пытаюсь манипулировать строкой открытых часов, которые мне даны.Objective C string manipulation, peeking, добавляя к

Он плохо отформатирован, и мне нужно довести его до того же стандарта, что и другой фрагмент данных из другого источника.

пн-ср чт 930-1700 900-1700 930-1700 Пт
пн - ср чт 930-1700 900-1700 930-1700 Пт
пн - чт пт 930-1600 930-1700
пн - ср чт 930-1700 900-1700 930-1700 Пт Сб 900-1200

Как вы можете видеть, не всегда есть промежутки между черточками на дни и т.д.

Мне нужно это быть разделены точкой с запятой следующим образом:

с понедельника по пятницу 930-1700; Thu 900-1700 ; Пт 930-1700
пн - ср 930-1700; чт 900-1700; пт 930-1700
пн - чт 930-1600; пт 930-1700
пн - ср 930-1700; чт 900-1700; Fri 930-1700; Sat 900-1200

Не уверен, что это лучшее/простое решение, но у меня возникла идея проверить, есть ли пробел после нуля и если после этого нуль есть буква, например, M, T, W, F или S. Тогда я бы знал, что это конец одного набора часов и заменить пространство точкой с запятой. Я новичок в объективе c и действительно не знаю, как заглянуть вперед или проверить отдельные символы в NSString. Это также кажется сложным решением.

Также связанный, мне нужно преобразовать эти часы с 24 часов до 12 часов. например, с 17:00 до 17:00, с 09:30 до 9:30. Я понимаю, что могу вычесть 1200 и добавить pm, но как добавить: между часом и минутой, а также удалить начальный ноль, если он до 10:00?

Извините за большой объем текста, но я чувствовал, что лучше объяснить его в начале.

Приветствия

ответ

1
// side note: you should probably not mess around with individual characters unless you're only dealing with ASCII 

NSString *text = // all your text 

NSMutableString *mutableText = [[text mutableCopy] autorelease]; // make a mutable copy so we can change in place 

[mutableText replaceOccurrencesOfString:@"\t" withString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [mutableText length])]; // delete Tabs 
[mutableText replaceOccurrencesOfString:@" -" withString:@"-" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [mutableText length])]; // make all dashes consistent 
[mutableText replaceOccurrencesOfString:@"- " withString:@"-" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [mutableText length])]; 

NSArray *words = [mutableText componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]]; // split each line 

NSMutableString *cleanedText = [NSMutableString stringWithCapacity:0]; // will hold cleaned-up string 

// go thru each line and insert semi-colon after all but the last hours 
for (NSString *record in words) 
{ 
    // assumes all hours end in zero 
    NSString *newRecord = [record stringByReplacingOccurrencesOfString:@"0 " withString:@"0;" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [record length])]; 
    [cleanedText appendFormat:@"%@\n", newRecord]; 
} 

NSLog(@"%@", cleanedText); // all done 

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

+0

Спасибо! Я придумал решение после работы над ним в течение нескольких часов, но он немного грязный, и я предполагаю, что он не очень надежный, когда он сталкивается с чем-то необычным. Ваше решение выглядит более простым, поэтому я думаю, что могу попробовать работать с этим. Мне, возможно, придется работать с вами, так как формат другого файла, который я пытаюсь выполнить, это: Пн-Тюр 9:30 - 16:00; Fri 9:30 - 17:00 Итак, у него есть еще несколько пробелы между временами и. Я здесь только новый, поэтому я не уверен, где это поставить, но я отправлю свое решение в качестве ответа для людей, чтобы разобраться и предложить помощь. Спасибо willc! –

+0

Также мне все равно придется делать это по строкам, а не объединять строки, поскольку я уже вытягиваю часы из объекта в другом месте –

0

Это то, что я придумал, но он все еще изволен. Является ли их не более простой способ искать строку, чтобы найти нулевую букву пространства (как в Mon-Thu 800-1700 Fri), а затем вставить символ?

Я использовал RegexKitLite и придумал следующее.

NSString *regexString = @"(\\d\\d\\d\\s[A-Za-z])"; //look for 3 numbers a space and a letter 

NSRange matchedRange = NSMakeRange(NSNotFound,NSNotFound); 

//clean other common problems in data 
NSString *outputString = [hoursString stringByReplacingOccurrencesOfString:@"," withString:@""]; 

outputString = [outputString stringByReplacingOccurrencesOfString:@"." withString:@""]; 

outputString = [outputString stringByReplacingOccurrencesOfString:@" &" withString:@""]; 

NSRange replaceRange; 

while (!matchedRange.length == 0) { //loop while not all matches in the one string found and fixed 

    matchedRange = [outputString rangeOfRegex:regexString capture: 1]; 

    if (!matchedRange.length == 0) { 

     //we want to add a semicolon 3 characters after the first found number 
     replaceRange = NSMakeRange(matchedRange.location+3, 1); 
     //replace space with ; 
     outputString = [outputString stringByReplacingCharactersInRange:replaceRange withString:@";"]; 
    } 
}