標題太難起了。這個功能的由來就是有的時候我們會根據外部的檔案,將檔案中的資料按要求匯入到資料庫中。在本人最近幾個月的工作中至少碰到三次了(一次xml檔案,一次文字檔,這一次是csv格式的),xml檔案的操作比較容易(您可以參考筆者之前的這一篇),對於txt或者csv等格式的檔案覺得有必要寫一個通用的方法,實現檔案內容的快速有效解析。下面記錄一下這個方法,您可以根據自己的需要適當修改成自己想要的形式。
1、讀入檔案
代碼
private const string fileType = "csv";
/// <summary>
/// 從fileupload控制項中讀出檔案內容(csv,txt等格式)
/// </summary>
/// <param name="txtFileName"></param>
/// <param name="data"></param>
/// <returns></returns>
public static string GetFileContent(string fileName, byte[] data)
{
string fileContent = string.Empty;
string[] strArr = fileName.Split('.');
if (string.Compare(strArr[strArr.Length - 1].ToUpper(), fileType.ToUpper()) != 0)
{
throw new FormatException("必須是(." + fileType + ")格式的檔案");
}
else
{
try
{
fileContent = System.Text.Encoding.GetEncoding("GB2312").GetString(data, 0, data.Length); //位元組轉化為字串
}
catch (Exception ex)
{
throw ex;
}
}
return fileContent;
}
2、解析檔案成實體
代碼
public static IList<T> ConvertFile2Model<T>(IList<IList<string>> listStr, IList<string> listProperty) where T : class, new()
{
IList<T> listModel = new List<T>();
//通過反射 顯示要顯示的列
BindingFlags bf = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static;//反射標識
T model = default(T);
Type objType = typeof(T);
PropertyInfo[] propInfoArr = objType.GetProperties(bf);
foreach (IList<string> listItem in listStr)
{
model = new T();
int len = listItem.Count;
if (listProperty.Count != len)
{
throw new Exception("屬性和要解析的列數量不等");
}
for (int i = 0; i < len; i++)
{
string property = listProperty[i];
foreach (PropertyInfo item in propInfoArr)
{
if (string.Compare(property.Trim().ToUpper(), item.Name.ToUpper()) == 0)
{
item.SetValue(model, listItem[i], null);
break;
}
}
}
listModel.Add(model);
}
return listModel;
}
在上面的方法中,我們還需要用到兩個輔助方法,貼出來:
(1)擷取實體屬性
代碼
public static IList<string> CreateModelProperty<T>() where T : class, new()
{
IList<string> listProperty = new List<string>();
BindingFlags bf = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static;//反射標識
Type objType = typeof(T);
PropertyInfo[] propInfoArr = objType.GetProperties(bf);
foreach (PropertyInfo item in propInfoArr)
{
listProperty.Add(item.Name);
}
return listProperty;
}
(2)、解析檔案內容成特定的形式
代碼
public static IList<IList<string>> CreateFileContentArr(string fileContent)
{
IList<IList<string>> listStr = new List<IList<string>>();
if (!string.IsNullOrEmpty(fileContent))
{
fileContent = fileContent.Trim();
string[] strArr = fileContent.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);//分行符號 一行記錄對應一個實體記錄
foreach (string item in strArr)
{
IList<string> listChild = new List<string>();
string[] strChildren = item.Split(',');//以逗號,分隔 可以是其他類型的符號,看具體需要
foreach (string strItem in strChildren)
{
listChild.Add(strItem);
}
listStr.Add(listChild);
}
}
return listStr;
}
ps: 解析檔案成特定的形式,是按照給出的檔案自訂解析。您可以抽象出變化點(比如分隔字元等),讓它更加通用。樣本中我是按照手頭的項目需要解析的,懶人一個,不費事了,不打醬油打麻將去也。
demo下載:demo