C#自定义文件解析,包含2个分隔符和不同的记录类型

时间:2017-03-21 18:01:59

标签: c# parsing

我有一个(不太有效)的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库。所以目前我每次循环的方式是:

  1. 基于逗号的字符串拆分。
  2. 按空格拆分第一个数组项。
  3. 使用switch语句确定类型并创建对象。
  4. 将该对象放入类型对象的列表中。
  5. 对于现在去哪里感到困惑,因为我现在有各种类型的列表,并且必须使用另一个开关或者如果要确定下一个部分。
  6. 我真的不确定我是否真的需要该列表,但我觉得用户希望能够手动翻阅文件中的记录。

    到目前为止,这已经开始制作非常长的,令人困惑的代码,我的直觉告诉我必须有一个更清洁的方法来做到这一点。我想也许使用Type.GetType(string)可以帮助简化一些代码,但这似乎在一个包含10k +记录的循环中可能非常低效,并且可能会让事情变得更加混乱。然后我想可能会使一些接口可能有所帮助,但我不是在这种情况下使用接口的最好的,我似乎最终在同样的情况下。

    那么解析这个文件会有什么更易于管理的方法呢?是否有任何C#解析库可以处理这样的事情?

2 个答案:

答案 0 :(得分:0)

您可以实现具有Timestamp属性和Process方法的IRecord接口(也许还有其他接口)。 然后,为每种类型的记录实现具体类型。

  1. 使用switch语句确定类型并创建并填充正确的具体类型。

  2. 将每个对象放在List

  3. 之后,你可以做任何你需要的事情。一些例子:

    遍历每个项目并调用Process()来处理它。

    使用linq .OfType<{concrete type}>对列表进行细分。 (警告10k 记录,这将是缓慢的,因为它将遍历每个具体类型的整个列表。)

    使用重写的ToString方法为IRecord

    提供单一文字表示

    如果使用WPF,您可以为每种具体类型定义数据类型模板,将ItemsControl衍生物绑定到IRecord s的集合和您的“详细信息”显示(例如ListItem或单独的{{1 }})将使用正确的ContentControl

    自动显示项目

答案 1 :(得分:0)

继续我的评论 - 这取决于。你所描述的对于初学者来说实际上是非常好的,你当然可以将它扩展到一系列工厂,每个对象类型一个 - 这样你就可以从显式切换转到搜索可以解析一条线的第一个工厂。如果您希望将来添加更多对象类型,可能会证明有用 - 您只需为新类型的对象添加另一个工厂。如果这些对象应共享一个公共接口,由您决定。接口通常用于定义行为,因此看起来并非如此。也许你应该只是一个字典?如果你真的需要强类型物品,你需要问自己吗?也许你需要的是一个带ObjectType属性和属性字典的简单类,它有一些帮助方法,可以轻松获取类型属性,如GetBool,GetInt或泛型Get?