2014-10-04 7 views
0

У меня есть очень большой и сложный файл данных (.txt, см. Ниже фрагмент) около 10 МБ и хотелось бы знать, как лучше его сохранить и получить доступ к нему позже. Мое приложение в настоящее время использует основные данные для хранения других объектов, но я не вижу, как я могу создать сущность из этого типа файла данных из-за его сложности.Предложения для обработки сложного + большого файла данных

Этот файл разделен следующим образом: Первая строка каждой основной секции начинается с буквы A | и означает, что будет определена новая «воздушная трасса». Затем, это имя, поэтому в приведенном ниже примере у нас есть воздушная трасса с именем V320 и другая по имени V321. В следующих строках мы имеем важные данные, «точки»/путевые точки, которые составляют эту воздушную трассу. Каждый из них имеет имя и координаты. Итак, первый из них - PLN на 45.63N и -84.66W (координаты). Затем оттуда следующий LORIW на 45.35N и -84.92W, от LORIW мы идем к IROTO и т. Д.

ПРИМЕЧАНИЕ: Может быть две, три, а может быть, 4 дыхательные пути с одинаковыми Например, «имя», например, V320, имеет 3 ... но каждый из них находится в собственной части карты.

Другие значения не имеют значения, например числа после пары координат.

По сути, мне нужно все это, чтобы затем рисовать линии на моей карте (GMSPolyLine с использованием SDK карты Google), которая проходит через все эти точки для каждой воздушной трассы, а затем для создания GMSMarkers (google version of MKAnnotation) для каждого которую пользователь может нажать. Я могу обрабатывать чертежи линий/маркеров на карте, но сложной частью для визуализации является манипулирование этими данными и упрощение доступа.

Дайте мне знать, если возникнут какие-либо вопросы.

A|V320|20 
S|PLN|045630647|-0084664108|LORIW|045352072|-0084924214|0|219|1998 
S|LORIW|045352072|-0084924214|IROTO|045188989|-0085075111|219|219|1168 
S|IROTO|045188989|-0085075111|ADENO|045030644|-0085220425|219|219|1132 
S|ADENO|045030644|-0085220425|TIDDU|044877978|-0085359767|215|215|1090 
S|TIDDU|044877978|-0085359767|SKIPR|044831714|-0085401772|215|215|330 
..... 

A|V321|29 
S|PZD|031655206|-0084293100|KUTVE|031866950|-0084451303|0|329|1505 
S|KUTVE|031866950|-0084451303|DUVAT|031948772|-0084512695|329|329|582 
S|DUVAT|031948772|-0084512695|LUMPP|032041158|-0084582139|329|329|657 
S|LUMPP|032041158|-0084582139|PREST|032176375|-0084684117|329|329|963 
S|PREST|032176375|-0084684117|CSG|032615253|-0085017631|326|326|3129 
S|CSG|032615253|-0085017631|JALVO|032722436|-0085064033|326|339|684 
..... 

ответ

1

Ваши данные демонстрируют некоторую закономерность. Если это предсказуемо и непротиворечиво, просто напишите парсер, который выполняет итерацию через файл и создает соответствующие объекты Core Data.

Например, тот факт, что каждая новая воздушная трасса отделена новой чертой, может помочь вам найти их. Кроме того, каждая конечная путевая точка повторяется в следующей строке, если вы не находитесь в конце записи воздушной трассы. Я думаю, вы можете сделать это, возможно, в 20-30 строк кода.

На вашей машине разработки (или даже на iPad или недавнем iPhone, если на то пошло), даже создание массива 10 МБ в памяти (для анализа) не должно быть ограничением.

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

Что касается синтаксического анализа, было бы что-то вроде этого:

NSString *file = [[NSString alloc] initWithContentsOfFile:fileURLString 
       encoding:NSUTF8StringEncoding error:nil]; 

NSArray *lines = [file componentsSeparatedByString:@"\n"]; 
for (NSString *line in lines) { 
    if (line.length < 1) { continue; } 
    NSArray *fields = [line componentsSeparatedByString:@"|"]; 
    if ([fields.firstObject isEqualToString:@"A"]) { 
     // insert new airway object and populate with other fields 
    } 
    else if ([fields.firstObject isEqualToString:@"S"]) { 
     // insert new waypoint object (two for each first line) 
     // assign as relationship to the current airway 
     // and to another waypoint as necessary 
    } 
} 
[managedObjectContext save:nil]; 
+0

Я уже включают в себя базу данных SQLite по умолчанию в моем приложении пачке быть скопированы к документам на первом запуске, ускоряет вещи. Тем не менее, я все еще неловко описываю, как писать этот парсер ... Еще относительно новый для этого вида работы в Obj C. – m179

+0

Это действительно просто. См. Мое редактирование выше. – Mundi

+0

Спасибо за фрагмент кода. Хорошо, теперь я понимаю, как обрабатывать файл, но какой тип объектов я мог бы создать в Core Data xcdatamodel? Он не был бы массивом, который я храню в каждой сущности «воздушной трассы», содержащей все путевые точки? – m179

Смежные вопросы