繁体   English   中英

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

[英]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来做到这一点。图书馆。 所以目前我每个循环的操作方式是:

  1. 根据逗号分割字符串。
  2. 用空格分割第一个数组项。
  3. 使用switch语句确定类型并创建对象。
  4. 将该对象放入类型对象的列表。
  5. 现在我要去哪里弄糊涂了,因为我现在有各种类型的清单,将不得不使用另一个开关或是否要确定下一个零件。

我不确定我是否真的需要该List,但是我感觉用户会希望能够手动浏览文件中的记录。

至此,这已经开始制作很长的,令人困惑的代码,而我的直觉告诉我,必须有一种更清洁的方法来执行此操作。 我以为使用Type.GetType(string)可能会简化一些代码,但这似乎在10k +条记录的循环中可能效率极低,并且可能使事情更加混乱。 然后,我认为也许创建一些接口可能会有所帮助,但是我并不是最擅长在这种情况下使用接口,而且我似乎最终会遇到同样的情况。

那么解析此文件的一种更易管理的方法是什么? 是否有任何C#解析库都可以处理类似的事情?

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

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

  2. 将每个对象放在列表中

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

遍历每个项目并调用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM