2014-10-04 88 views
0

我有一個非常龐大而複雜的數據文件(.txt,見下面的代碼片段),大小約爲10MB,並且想知道存儲和隨後訪問它的最佳方式。 我的應用程序當前使用核心數據存儲其他實體,但我不明白如何從這種類型的數據文件創建實體,因爲它的複雜性。處理複雜數據+大型數據文件的建議

此文件分爲以下幾部分: 每個主要部分的第一行以A |並且意味着要定義一個新的'航線'。那麼,它是不是名字,所以在下面的例子中,我們有名爲V320的氣道和另一個名爲V321的氣道。在以下方面,我們有重要的數據,構成這條航線的'點'/路點。每個人都有一個名字和座標。所以第一個是45.63N和-84.66W(座標)的PLN。然後,從那裏下一個是45.35N和-84.92W的LORIW,從LORIW我們去IROTO,等等......

注意:可能有兩個,三個甚至四個航空公司例如V320的「名稱」有3個......但每個都在它自己的地圖部分。

其他值無關,如座標對後面的數字。

本質上,我需要所有這些,以便我可以在我的地圖上繪製線條(GMSPolyLine使用Google地圖SDK),通過所有這些點爲每個氣道創建GMSMarkers(每個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上),甚至在內存中創建一個10MB的數組(應該被解析)都不應該是一個限制。

如果數據是靜態的,您可以使用生成的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 2014-10-05 01:11:43

+0

這非常簡單。看到我上面的編輯。 – Mundi 2014-10-05 07:13:50

+0

感謝您的代碼片段。好吧,我現在明白如何處理文件,但是我會在Core Data xcdatamodel中創建什麼類型的實體?它應該是一個數組,我存儲在包含所有路點的「航線」的每個實體中? – m179 2014-10-05 12:13:50