2015-01-10 8 views
1

Я хочу сохранить этот .txt файл основных данныхСохранение большого текстового файла с разделами в Core Data атрибуты

http://openweathermap.org/help/city_list.txt

Но как вы можете видеть, что это имеет 5 различных секций 1) ID (город ID) 2) нм (имя) 3) Lat (широта) 4) долгота (широта, долгота) 5) COUNTRYCODE

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

Спасибо и дайте мне знать, если Theres любой другой информации я могу предоставить

ответ

2

Первое, что вы должны сделать здесь загрузить данные. Вы можете сделать это, используя NSURLConnection. Затем вы хотите прочитать его по строкам, чтобы получить разные города. Когда вы читаете его по строкам, вы можете получить каждое отдельное поле, разделив их символом табуляции (\t). Когда у вас есть каждое отдельное поле, не забудьте поместить их в базу данных.

Пример кода:

- (void)downloadAndParseCityList { 
    NSURL *listURL = [NSURL URLWithString:@"http://openweathermap.org/help/city_list.txt"]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:listURL]; //Forge the request to be used by NSURLConnection. 
    NSData *cityData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; //You probably use an asynchrounous request instead, but I'm too lazy to do that here. 

    NSString *cityString = [[NSString alloc] initWithData:cityData encoding:NSASCIIStringEncoding]; //We're going to work with the data as an NSString. 

    NSArray *cities = [cityString componentsSeparatedByString:@"\n"]; //By getting the components seperated by line-break, it is easier to work with each individual city more like an object. 

    for(NSUInteger i = 1; i <= [cities count]-1; i++) { //We start at i=1 because we don't want to parse the first line in the file ("id nm lat lon countryCode"), as these are just the field names. 
     NSString *cityString = cities[i]; 
     NSArray *cityFields = [cityString componentsSeparatedByString:@"\t"]; //All the fields are seperated by a tab ('\t'), that makes it easy to read all the fields. 

     for(NSString *field in cityFields) { 
     //Here you probably want to do something with the fields. Save them to a Core Data database or something. 
     } 
    } 
} 

Вы должны выяснить, часть о Core Data для себя, так как я не использовал этого достаточно, чтобы быть удобным с отправлять что-либо об этом в качестве ответа.

(код не был проверен, поэтому он не может работать из коробки.)

Edit: Я извиняюсь, код не работает вообще, кажется, что данные были слишком большими для NSString, но первая часть ответа по-прежнему применяется. Сначала проанализируйте каждый отдельный город путем разрыва строки (\n), а затем проанализируйте каждое поле по вкладке (\t).

EDIT 2:

код теперь работает отлично после изменения кодировки в NSASCIIStringEncoding

+1

Ваш первый ответ был не прав, но не по той причине, вы думаете. NSString может содержать более 300 000 байт. Проблема заключалась в том, что кодирование на самом деле является «NSASCIIStringEncoding». Спасибо за ответ tho – MendyK

+0

О, думаю, я просто слишком привык к UTF8Encoding. Тогда надеюсь, что вы получили что-то из ответа. –

+0

Определенно полезный ответ, достойный проверки. – MendyK

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