表读取器中的文件读取器封装

本文关键字:读取 封装 文件 | 更新日期: 2023-09-27 18:27:01

我有一个文件读取器对象,我需要读取一个包含表的文件。我想创建一个名为Table的对象来保存读取文件中的行和列数据。问题是,要阅读整个页面,我需要一个表列表(文件中有多个表)。我的类的最佳结构是什么,这样我就不会过多地暴露数据读取器,也不会太多地传递它?

我目前的想法是:

  1. 创建一个实例化表列表的类,并将该类传递给读取器
  2. 运行读取器,对于找到的每个新表,实例化一个新的表对象,并将引用传递给读取器,以便它可以获得行/列信息

这是完成这类任务的最佳方式吗?或者有没有更有效的设计来限制读者过多的阅读?我必须使用using语句,在这个嵌套设计中使用它感觉不太合适

感谢

表读取器中的文件读取器封装

您可能会使用已经可用的DataTable。使用它们会有一点开销,但听起来很容易使用。

你确实说过这些表包含不同的结构。文件中是否有标识表更改的内容?如果同一文件中有许多"表",这可能会使操作变得更加困难。

如果您想列出它们的列表,您可以简单地使用类型为DataTable的集合。我想如果你的设计保证的话,你可以为此创建自己的类。

List<DataTable> tables = new List<DataTable>();

以及如何使用它的示例方法:

private IList<DataTable> GetTables()
{
    IList<DataTable> tables = new List<DataTable>();
    using (StreamReader reader = new StreamReader(pathAndFile))
    {
        //pseudo-code below
        //Iterate through tables in the file: foreach(DiscoveredTable table in file)
        //parse from csv: table = GetTableFromCsv(table.DataFromTheFile);
        //add to tables collection: tables.Add(table);
    }
    return tables;
}

如果你有兴趣走这条路,这里有一个CSV解析器的链接,因为你说它是逗号分隔的。

我个人赞同将Table集合封装在控制读取器的自己的类中的想法。如果隐藏这些细节是一个问题,我也不允许公开实例化任何一个对象。像这样的东西。

public class TableCollection : List<Table>
{
   private TableCollection() { }
   public static TableCollection FromFile(string filePath)
   {
       using (StreamReader reader = new StreamReader(filePath))
       {
           //populate all tables here before disposing
       }
   }
}
public class Table
{
   //whatever other properties/methods
   //keep it internal to hide the implementation from the user
   internal Table(StreamReader reader)
   {
      //do what you need to do here
   }
}