[英]C# custom file parsing with 2 delimiters and different record types
我有一个(不是很有效)CSV文件,其中包含多种类型的行。 任何记录可能是大约6种不同类型之一,并且每种类型都有不同数量的属性。 任何行的第一部分都包含时间戳记和记录类型,后跟数据的标准CSV。
例
1456057920 PERSON, Ted Danson, 123 Fake Street, 555-123-3214, blah
1476195120 PLACE, Detroit, Michigan, 12345
1440581532 THING, Bucket, Has holes, Not a good bucket
为了使事情更复杂,我需要能够根据某些条件对记录进行不同的处理。 因此,可以将PERSON类型自动插入到DB中,而无需用户输入,但是THING类型将显示在屏幕上,供用户检查和批准,然后再添加到DB中并继续进行解析等。
通常,我会使用CsvHelper之类的库将记录映射到类型,但是在这种情况下,由于类型可能不同,并且第一部分使用空格而不是逗号,因此我不知道如何使用标准CSV来做到这一点。图书馆。 所以目前我每个循环的操作方式是:
我不确定我是否真的需要该List,但是我感觉用户会希望能够手动浏览文件中的记录。
至此,这已经开始制作很长的,令人困惑的代码,而我的直觉告诉我,必须有一种更清洁的方法来执行此操作。 我以为使用Type.GetType(string)可能会简化一些代码,但这似乎在10k +条记录的循环中可能效率极低,并且可能使事情更加混乱。 然后,我认为也许创建一些接口可能会有所帮助,但是我并不是最擅长在这种情况下使用接口,而且我似乎最终会遇到同样的情况。
那么解析此文件的一种更易管理的方法是什么? 是否有任何C#解析库都可以处理类似的事情?
您可以实现具有Timestamp属性和Process方法(也可能还有其他方法)的IRecord
接口。 然后,为每种记录类型实现具体类型。
使用switch语句确定类型,并创建并填充正确的具体类型。
将每个对象放在列表中
之后,您可以做任何您需要的事情。 一些例子:
遍历每个项目并调用Process()进行处理。
使用linq .OfType<{concrete type}>
分割列表。 (警告1万条记录会很慢,因为它将遍历每种具体类型的整个列表。)
使用重写的ToString
方法给出IRecord
的单个文本表示IRecord
如果使用WPF,则可以为每种具体类型定义一个数据类型模板,将ItemsControl
派生绑定到IRecord
的集合,并且您的“详细信息”显示(例如ListItem或单独的ContentControl
)将使用正确的DataTemplate
自动显示该项目
继续我的评论-取决于。 您所描述的内容实际上对于初学者来说非常不错,您当然可以将其扩展为一系列针对每种对象类型的工厂-这样您就可以从显式开关切换到搜索可以解析行的第一个工厂。 如果您将来打算添加更多的对象类型,可能会证明很有用-您只需添加另一个工厂即可用于新的对象。 这些对象应共享一个公共接口,由您自己决定。 接口通常用于定义行为,因此似乎并非如此。 也许您应该宁愿只是字典? 您需要问自己是否真的需要强类型对象? 也许您需要的是一个简单的类,该类具有ObjectType属性和Dictionary属性,并带有一些用于轻松键入属性访问的帮助方法,例如GetBool,GetInt或通用Get?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.