用NSData&amp ;;加载iOS自定义文件格式NSCoding

我正在寻找一些iOS Cocoa程序员的一些指导,说明如何实现一种机制来加载和解析我将在内存中使用的模型对象中的自定义文件格式。我知道必须有很多方法来破解这个坚果,但让我分享一下我探索过的当前路径的基本概念,以及我陷入困境的地方。 但首先,这里是上下文:说我有一个我无法改变的现有文件格式。它基本上是一种奇特的管道分隔格式,分为不同的部分,每个部分都是这样的:
%n|sectionName
...并且后面的n行都以对该部分唯一的方式进行管道分隔。有些部分有一个以管道分隔的标题行,后面是n行数据(也是管道分隔的),而其他部分可能只有n个以管道分隔的行。在文件的开头有几个简短的部分,最后会有一个巨大的部分描述k-ary树的节点:它们的父子关系和与每个节点相关的任何数据。总而言之,这些文件的大小是几十兆字节,未来可能更大。 最后,最后一点上下文是我对iOS编程很新。 我开始使用
NSFileHandle
获取文件的表示形式作为
NSData
的实例。这很简单,在探索
NSData
接口并尝试从那里开始之后,我注意到了
NSCoding
协议,它声称是一个用于将对象归档和序列化为(和来自)表示的工具。 我认为这听起来像我可能需要的东西,因为我倾向于认为文件格式只是表示我的模型对象可以编组进去。然而,在深入研究“档案和序列化编程指南”之后,我开始猜测自己。 API似乎不适合我想要完成的任务。 我在这里走了一条死胡同吗?我是否应该寻求继承
NSInputStream
,或者我应该采取其他一些我缺失的方法?     
已邀请:
NSCoding可能是错误的方法。它专为序列化和反序列化Objective-C类型而设计,而不是解析自定义文件格式。 可能没有必要继承NSInputStream。你最好的选择是使用C的stdio库,特别是
fgets
来读取这些行。如果你真的想使用NSInputStream或NSFileHandle你当然可以,你只需要自己解析字符串中的每一行(这真的不是那么难)。     
我建议使用Ragel来处理解析智能。一旦你有基本的脚手架来设置解析器并将字节输入到它中直到解析完成,它应该比使用ѭ7更容易。 您希望用于存储已解析结果的对象取决于您。使用状态机转换触发的动作函数构建对象图不应该太难。 您希望如何将字节输入Ragel也取决于您。您可以使用C标准IO流,Foundation流或Foundation文件句柄。所有Ragel关心的都是关注字符的缓冲区,以便它可以通过编译描述的状态机来运行它。
NSCoder
可能比你的目的更麻烦。它希望被用作一种持久化和解码Obj-C对象的方法,其中编码/解码由对象的需求驱动(“好吧,现在给我一个int,现在很简短,现在关于一个Obj-C对象怎么样...... “)。     
正如你正确指出的那样,有多种方法可以破解这个坚果。不幸的是,你没有指出你想要对解析的数据做什么,如果你想最终写出文件。 首先,对于解析,必须考虑使用Objective-C是否有意义。我可以考虑编写一个小帮助Perl脚本,它非常适合解析文本文件并将输出写入XML文件或更好的plist文件。然后可以使用Objective-C代码读入此文件,您可以使用数据。您也可以选择将数据写入sqlite数据库,这也是一种合适的文件格式,因为有大量可用语言的数据连接器(C,Perl,Python等)。 其次,如果你想解析文本文件,那么值得一看的类是
NSLineScanner
,它用于解析文本文件。 我没有看到使用
NSInputStream
的任何好处,因为它只返回原始字节。 编辑 在iOS设备AFAIK上无法使用其他语言进行此预处理。所以这个选项只能在mac上使用。     
有一些开源解析相关工具包,每个工具包的目标略有不同。其中一个或者没有一个对您有用,但提及它们以回答您的问题似乎对其他人来说似乎有用,至少。 ParseKit 解析:: CSV RegexKit     

要回复问题请先登录注册