在处理数据导入时,经常会遇到需要从非结构化文件(如INI文件)中读取数据并导入到数据库中的情况。这类文件通常不遵循简单的逗号分隔或制表符分隔的格式,而是以一种更原生的格式存储数据。本文将介绍如何使用C#来实现这一过程。
INI文件是一种常见的非结构化文件格式,它包含节(sections)和键值对(key/value pairs)。尽管这种格式相对简单,但它并没有明确的列分隔或数据分隔符。因此,需要一种方法来解析这种文件格式,并将其内容导入到数据库中。
为了读取INI文件,可以使用C#中的System.IO.StreamReader
类来逐行读取文件内容。在读取过程中,需要识别出文件中的节和键值对,并相应地触发事件。
在IniFileReader
类中,定义了两个事件:SectionRead
和KeyValueRead
。这两个事件分别在读取到节和键值对时被触发。
public delegate void SectionHandler(string sectionName);
public event SectionHandler SectionRead;
public delegate void KeyValueHandler(string section, string key, string sValue);
public event KeyValueHandler KeyValueRead;
在IniFileReader
类中,使用StreamReader
读取文件,并在读取到节或键值对时触发相应的事件。
public void ReadIniFile(string filename)
{
StreamReader sr = new StreamReader(filename);
string currentSection = null;
while (!sr.EndOfStream)
{
string oneLine = sr.ReadLine();
if (oneLine.StartsWith("[") && oneLine.EndsWith("]"))
{
SectionRead(currentSection);
}
else
{
string[] keyvalue = oneLine.Split('=');
KeyValueRead(currentSection, keyvalue[0], keyvalue[1]);
}
}
}
在读取INI文件的同时,需要将读取到的数据导入到数据库中。为此,创建了一个IniFileData
类,该类订阅了IniFileReader
类中的事件,并在事件触发时将数据添加到DataSet
中。
在IniFileData
类中,创建了IniFileReader
的实例,并订阅了它的事件。
public void ReadIniFile(string PathName)
{
IniFileReader ir = new IniFileReader();
ir.SectionRead += new IniFileReader.SectionHandler(this.OnSectionRead);
ir.KeyValueRead += new IniFileReader.KeyValueHandler(this.OnKeyValueRead);
ir.ReadIniFile(PathName);
}
在事件处理函数中,根据读取到的节和键值对创建相应的数据行,并将其添加到DataSet
中。
private void OnSectionRead(string Section)
{
// 创建节
}
private void OnKeyValueRead(string Section, string Key, string sValue)
{
// 插入键值对
}