表读取器中的文件读取器封装
本文关键字:读取 封装 文件 | 更新日期: 2023-09-27 18:27:01
我有一个文件读取器对象,我需要读取一个包含表的文件。我想创建一个名为Table的对象来保存读取文件中的行和列数据。问题是,要阅读整个页面,我需要一个表列表(文件中有多个表)。我的类的最佳结构是什么,这样我就不会过多地暴露数据读取器,也不会太多地传递它?
我目前的想法是:
- 创建一个实例化表列表的类,并将该类传递给读取器
- 运行读取器,对于找到的每个新表,实例化一个新的表对象,并将引用传递给读取器,以便它可以获得行/列信息
这是完成这类任务的最佳方式吗?或者有没有更有效的设计来限制读者过多的阅读?我必须使用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
}
}