gpt4 book ai didi

C# 动态映射输入文件的方法

转载 作者:行者123 更新时间:2023-11-30 18:09:49 26 4
gpt4 key购买 nike

我正在尝试找出将输入文件(例如 XLS 或 CSV 文件)映射到系统中对象的最佳方法。让我稍微扩展一下。我有以下对象:

公司联系方式

每个变量都有变量,例如:

地址电话号码电子邮件等等

我能得到的输入文件各不相同,有时会有列标题,有时没有,列的排列和数字有时会发生变化。它可能如下所示:

COMPANY         - CONTACT       - ADDRESS       - PHONE
----------------------------------------------------------------------
company1 contact1 address1 phone1
company1 contact2 address2
company2 contact3 phone2
contact4 address3

上面显示“company”将附加到公司的“addres1”和“phone1”,“contact1”是它自己的对象,但具有“company1”作为其父对象。

“contact2”也是如此(电话除外)。

“contact4”没有父对象,因此“address3”属于联系人,而不是公司。

到目前为止,我的想法是拥有以下对象:

映射 -(这是我不确定如何实现它的地方。它应该说明列应如何映射到变量、所有权/层次结构 - 例如公司有地址)

IMappingLoader -(加载映射对象)

-- XmlMappingLoader

-- DbMappingLoader

IDataLoader -(将数据加载到数据集中)

-- XLSLoader

-- CSV加载器

因此将加载映射,将数据加载到数据集中并返回正确的对象。

我不太确定最好的方法是如何进行映射部分。如何能够说出哪一列应该属于哪个对象。

感谢所有建议。

乔恩

最佳答案

您的解析器将不得不了解您的列....否则它无法将数据映射到特定的对象属性。当然,除非您引入一个索引属性类,您可以根据读取的顺序存储信息。

您应该创建一个解析器工厂,并根据文件的扩展名为作业返回正确的解析器,例如

public class Record 
{
private Dictionary<int, string> items = new Dictionary<int, string>();
private int propCount;

public Record(int size)
{
// populate array with empty strings
for(int i = 0; i <= size -1; i++)
items.Add(i, String.Empty);
propCount = size;
}

public string this[int index]
{
get { return items[index]; }
set { items[index] = value; }
}

public int PropertyCount { get { return propCount; } }
}

public interface IRecordParser
{
string FileName { get; set; }
string[] GetHeadings();
bool HasHeaders { get; set; }
void GoToStart();
Record ParseNextRecord();
}

public abstract class RecordParser
{
public string FileName { get; set; }
public bool HasHeaders { get; set; }
public abstract string[] GetHeadings();
public abstract void GoToStart();
public abstract Record ParseNextRecord();
}

public class ExcelRecordParser : RecordParser, IRecordParser
{
public ExcelRecordParser()
{
}

public override string[] GetHeadings()
{
if (HasHeaders)
// return column headings
else
// return default headings from settings file
}

public override void GoToStart()
{
// navigate to first row (or +1 if HasHeaders is true)
}

public override Record ParseNextRecord()
{
var headers = GetHeadings();
var r = new Record(headers.Length);

// enumerate rows, then for each row do...
for(int i = 0; i <= headers.Length - 1; i++)
r[i] = row[i];

return r;
}
}

public class CsvRecordParser : RecordParser, IRecordParser
{
public CsvRecordParser()
{
}

public override string[] GetHeadings()
{
if (HasHeaders)
// return first row split as headings
else
// return default headers from settings file
}

public override void GoToStart()
{
// navigate to start of file (or +1 if HasHeaders is true)
}

public override Record ParseNextRecord()
{
var headers = GetHeadings();
var r = new Record(headers.Length);

// enumerate lines, then for each line do...
for(int i = 0; i <= headers.Length - 1; i++)
r[i] = line[i];

return r;
}
}

public static class RecordParserFactory
{
public static IRecordParser Create(string ext)
{
switch (ext)
{
case ".xls":
return new ExcelRecordParser() as IRecordParser;
case ".csv":
return new CsvRecordParser() as IRecordParser;
default:
return null;
}
}
}

用法

// would return an instance of CSV Parser
string file = @"C:\Data\MyRecords.csv";
IRecordParser parser = RecordParserFactory.Create(System.IO.Path.GetExtension(file));

// would return an instance of Excel Parser
string file = @"C:\Data\MyRecords.xls";
IRecordParser parser = RecordParserFactory.Create(System.IO.Path.GetExtension(file));

如果您的文件格式将来发生变化,这将允许您添加其他解析器,例如XML、二进制等

关于C# 动态映射输入文件的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2220734/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com