我有一个(不太有效)的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库。所以目前我每次循环的方式是:
我真的不确定我是否真的需要该列表,但我觉得用户希望能够手动翻阅文件中的记录。
到目前为止,这已经开始制作非常长的,令人困惑的代码,我的直觉告诉我必须有一个更清洁的方法来做到这一点。我想也许使用Type.GetType(string)可以帮助简化一些代码,但这似乎在一个包含10k +记录的循环中可能非常低效,并且可能会让事情变得更加混乱。然后我想可能会使一些接口可能有所帮助,但我不是在这种情况下使用接口的最好的,我似乎最终在同样的情况下。
那么解析这个文件会有什么更易于管理的方法呢?是否有任何C#解析库可以处理这样的事情?
答案 0 :(得分:0)
您可以实现具有Timestamp属性和Process方法的IRecord
接口(也许还有其他接口)。
然后,为每种类型的记录实现具体类型。
使用switch语句确定类型并创建并填充正确的具体类型。
将每个对象放在List
之后,你可以做任何你需要的事情。一些例子:
遍历每个项目并调用Process()来处理它。
使用linq .OfType<{concrete type}>
对列表进行细分。 (警告10k
记录,这将是缓慢的,因为它将遍历每个具体类型的整个列表。)
使用重写的ToString
方法为IRecord
如果使用WPF,您可以为每种具体类型定义数据类型模板,将ItemsControl
衍生物绑定到IRecord
s的集合和您的“详细信息”显示(例如ListItem或单独的{{1 }})将使用正确的ContentControl
答案 1 :(得分:0)
继续我的评论 - 这取决于。你所描述的对于初学者来说实际上是非常好的,你当然可以将它扩展到一系列工厂,每个对象类型一个 - 这样你就可以从显式切换转到搜索可以解析一条线的第一个工厂。如果您希望将来添加更多对象类型,可能会证明有用 - 您只需为新类型的对象添加另一个工厂。如果这些对象应共享一个公共接口,由您决定。接口通常用于定义行为,因此看起来并非如此。也许你应该只是一个字典?如果你真的需要强类型物品,你需要问自己吗?也许你需要的是一个带ObjectType属性和属性字典的简单类,它有一些帮助方法,可以轻松获取类型属性,如GetBool,GetInt或泛型Get?