13,1,历史,1
,263,史密斯,鲍勃,新生
,317,2,琼斯,约翰,Sophmore
14,数学1,
,311,金,玛丽,352,能源部,弗雷德,高级
第一个数字是类的类型(即13 =历史),第二个数字是多少个部分(即1 = 1个等级),第三个数字是会议模式(即1 =星期一,星期三,星期五),然后是班级名称.我不太关心课程的其余部分,所以我想我可以让它忽略那些角色.
对于第2行和第3行,逗号后面的第一个数字是学号,然后是座位号,然后是姓氏,名字,学年.
所以我认为有两个主要挑战.首先是如何解析数据,以便我可以知道每个类中的许多人和谁,所以我可以将其调用到表视图中(稍后添加),然后我不知道如何将整数值与会议模式或班级名称(即13 =历史,1 =周一/周三/周五)
非常感谢你的帮助
解决方法
你的主要问题的答案是“是”.如果必须将CSV文件导入应用程序,则应使用NSScanner.
CSV(逗号分隔值)是一种非常棘手的文件格式.乍一看,它看起来很简单.不幸的是,在实践中它不是简单的!事实证明,它甚至没有特别明确. CSV是我所见过的任何类型数据文件的杂乱“黑客”最接近的东西!
显然,微软已经将CSV文件编写为像BASIC“DATA”语句一样工作.自1970年代中期以来,他们一直在解析的东西很好.不幸的是,他们应该把它留在那里. DATA语句从未打算作为文件格式,只是一种快捷方式,可以避免将简单数据放入文件中.比硬编码赋值语句更好,但那是关于它的.
扫描CSV文件的问题在于它使用了数据本身可能出现的分隔符.这并不能阻止它可用.它只是增加了复杂性,这些复杂性增加了扫描仪的复杂性.复杂性以特殊情况的形式出现.您基本上必须为CSV文件定义正式语法.
天真的实现不会这样做.您的课程名称或其中一个名称字段可能包含逗号.例如,如果班级中有“初级”,他们可能会有“小”.部分名字之后.或者一个类可能被称为“触发,荣誉”.用户可能会输入,前端程序 – 毕竟可能是一个简单的文本编辑器,可能无法阻止它.只要字段用引号括起来,就可以在其中嵌入逗号.
我曾经在一个有人写过的CSV导入程序中拿起球并按照所谓的方式检查我们的版本控制.事情是,事实并非如此.它正在炸毁文件的第四个记录.该记录中有一个字段,名称为“XYZ,INC.”.在里面.那么,嵌入的逗号就把它丢掉了.
我写了一个真正的词法分析器(扫描仪)来解析我们的CSV导入文件.这解决了这个问题.导入例程实际上开始工作,所以我检查了它并将“bug”(咳嗽,咳嗽)标记为“固定”.
正如您可能已经猜到的那样,我认为程序员不太可能不知道他的代码是无法使用的,特别是考虑到它不能用于基线测试数据.如果您正在为其他人编写此应用程序以供使用或进行高等级,请不要对CSV输入扫描仪进行精细处理:做好工作.更少的东西就是“伪装”.
这就是为什么处理这个问题的最好方法是在需求阶段击落CSV文件支持!告诉利益相关者,制表符分隔的文件是一种非常简单的解析格式. CSV优先于制表符分隔的唯一时间是在记录的任何字段中需要支持嵌入的换行符和/或制表符的情况.
但是,如果您的项目是这种情况 – 尝试不同的方法,以便您可以避免CSV:建议XML.然后,编写一个模式(DTD,XSD或RNC,这是我个人最喜欢的),这样您就可以使用您正在使用的任何XML解析API验证输入,如果您的解析引擎支持验证.
如果您坚持使用CSV,那么幸运的是,有一个非常好的教程显示如何使用名为Writing a parser using NSScanner (a CSV parsing example)的NSScanner输入CSV.
看一看,你可以看到它并不简单 – 作者也没有让它过于复杂.您可能希望为整个博客和文章添加书签.对于Cocoa开发人员来说,这是一个非常优秀的博客.
另一个CSV扫描器的例子可以在Cocoa for Scientists (Part XXVI): Parsing CSV Data找到.虽然它没有给出解决方案域问题的解释,也没有进入设计 – 你仍然可以看到可用代码不仅仅需要分割使用逗号和换行符排列.
您需要考虑的程序的下一部分是Developing with Core Data.确保您在IDE中检查了Cocoa iPhone应用程序并选中了Core Data.此外,在Interface Builder中尽可能多地进行数据建模和GUI设计,而不是努力手动编写大量代码.
要使用Cocoa的Core Data部分存储记录,您需要定义NSManagedobject的子类(参见NSManagedObject class reference).顺便说一下,这是在Cocoa Dev Central观看Core Data Class Overview的好时机.熟悉核心数据中的基本对象类型.图表和解释将清楚地说明不同的Core Data抽象和类如何在您的应用程序中组合在一起.
选择一个好的业务对象(问题域)名称,如注册,或者更好 – CourseRegistration.小心不要选择听起来不像解决方案领域的东西.在这种情况下,我会特别远离使用诸如类,注册或计划之类的单词,因为它们在编程中具有特殊含义.没有意义混淆问题域和解决方案域之间的界限.
如果要设置真实数据库,而不是仅将从CSV导入文件中读取的记录转储到数据库中的单个表中,您可能还需要定义名为Student和Course的NSManagedobject子类.您将使用Interface Builder通知Core Data这两者与CourseRegistration之间存在关联.
我在下面引用的教程中有一个示例,向您展示如何设置这些关系.
以下是创建Core Data应用程序的步骤有点过时的演练:Build a Core Data App.它不是过时的编程方式.
只是Xcode IDE和Interface Builder工具的一些对话框经过了大量的重新设计.功能是相同的,但它在几年或更久以前编写的教程中的屏幕截图有时难以遵循.
如果您之前没有使用过Core Data,请注意Entity是一种持久对象类型,其实例存储在数据库(或文件存储)中(并从中加载).属性基本上是实体的字段.属性具有名称和类型,就像属性一样.
在子类化NSManagedobject以及一般使用Core Data时,您必须遵循一些规则.所以我鼓励你阅读Introduction to Core Data programming Guide.至少现在你已经得到了一些帮助,从教程中,你不会感到很冷.
Conveniently,Cocoa为您提供了一个NSScanner类,用于简化输入CSV导入文件,以及您决定用来保存数据的Core Data工具.
正如您所指出的,您将需要一个用于编辑数据集的GUI. Cocoa使用Model-View-Controller triad作为其GUI设计模式.
NSTableView可能是一个很好的事情,可以放入您的应用程序的GUI来做到这一点.这将为您提供用户界面中记录的表格视图.
有一个NSTableView Tutorial,您应该在CocoaDev查看.CocoaDev网站是一个非常好的资源,可以指导您完成Cocoa编程的各个领域.如果您需要更多帮助,那里有Another NSTableView Tutorial.
人们常常不知道如何使用NSTableView作为控制器.我建议你阅读NSArrayController课程.您可能需要查看一些Cocoa Bindings Examples and Hints. Cocoa Bindings,in a Nutshell,这是一种使视图中的属性与模型对象的属性保持同步的方法.
大多数程序员最终都意识到大多数数据库应用程序只是:收集数据,移动数据值,然后启动然后将更改传播到它的各个部分. Model-View-Controller架构以一种漂亮,松散耦合的方式将您的UI与业务对象分开.
绑定是一种将它们连接在一起的声明机制.它们仍然保持松散耦合,所以不要担心它们违反了MVC设计模式的任何架构规则.
绑定对于使用Interface Builder等WYSIWYG GUI构建工具进行快速应用程序开发非常方便.
如果没有绑定,则必须手动编写过程代码,以将用户界面组件与模型中的数据相关联.绑定使您可以在Interface Builder中处理该问题.结果是您最终构建数据管理应用程序,而不是“编码”它.
如果你需要一本好书来讨论如何使用Xcode在特定应用程序中编写Cocoa或Core Data,那么Xcode 3 Unleashed就相当不错了.
它没有详细说明iPhone开发,但我假设您可以访问有助于解决iPhone特定限制和功能的文档.针对iPhone意味着您将不得不使用memory management的引用计数方法,而不是使用Objective-C 2.0引入的更新的垃圾收集方法.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。