2014-10-04 100 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