.NET中如何将文本文件的内容存储到DataSet
程序员文章站
2023-11-09 12:50:22
前言
项目中对文本文件的操作比较简单,但是如果需要将文本文件的内容写入系统的缓存中,操作起来,会稍微的繁琐一些。现在总结一个较为通用的方法,将文本文件的内容缓存进入dat...
前言
项目中对文本文件的操作比较简单,但是如果需要将文本文件的内容写入系统的缓存中,操作起来,会稍微的繁琐一些。现在总结一个较为通用的方法,将文本文件的内容缓存进入dataset数据集中。下面话不多说了,我们直接来看示例代码吧。
示例代码
private dataset _iifset; /// <summary> /// 将文本文件转化为dataset /// </summary> /// <param name="filepath"></param> /// <returns></returns> public dataset parse(string filepath) { if (string.isnullorempty(filepath)) { throw new argumentnullexception(filepath); } try { _iifset = new dataset(); var filetext = system.io.file.readalltext(filepath); var lines = filetext.split('\n'); createtables(lines, _iifset); fillset(lines, _iifset); return _iifset; } catch (ioexception ex) { throw new ioexception(ex.message); } } /// <summary> /// 读取行数组并将其解析为数据集的表 /// </summary> /// <param name="lines">string iif文件中的行数组</param> /// <param name="set"></param> private void fillset(ireadonlylist<string> lines, dataset set) { for (var i = 0; i < lines.count; i++) { if (istableheader(lines[i])) { continue; } if (lines[i] == "" || lines[i] == "\r" || lines[i] == "\n\r" || lines[i] == "\n") { continue; } if (lines[i].indexof(";__imported__", stringcomparison.ordinal) != -1) { continue; } var line = lines[i]; while (!isfullline(line, set)) { i++; line += lines[i]; } parserecord(line, set); } } /// <summary> /// 解析记录 /// </summary> /// <param name="line"></param> /// <param name="set"></param> private void parserecord(string line, dataset set) { if (istableheader(line)) { return; } var tablename = line.split('\t')[0]; var parameters = createdatarowparams(line, set.tables[tablename].columns.count); if (parameters.length > 0) set.tables[tablename].rows.add(parameters); } private bool isfullline(string line, dataset set) { if (istableheader(line)) { return true; } var values = line.split('\t').length; var tablename = line.split('\t')[0]; var columns = set.tables[tablename].columns.count; return values >= columns; } private bool istableheader(string tab) { return tab.startswith("!"); } /// <summary> /// 创建datatable /// </summary> /// <param name="lines"></param> /// <param name="set"></param> private void createtables(ireadonlylist<string> lines, dataset set) { foreach (var t in lines.where(istableheader)) { set.tables.add(createtable(t)); } } private datatable createtable(string line) { var values = line.split('\t'); values[0] = values[0].substring(1); var dt = new datatable(values[0]); values[0] = null; foreach (var name in values) { if (string.isnullorempty(name)) continue; var dc = new datacolumn(name, typeof(string)); try { dt.columns.add(dc); } catch (duplicatenameexception) { dc = new datacolumn(name + "_duplicatecol" + dt.columns.count); dt.columns.add(dc); } } return dt; } public string gettablename(string line) { var values = line.split('\t'); if (values[0].startswith("!")) { values[0] = values[0].substring(1); } return values[0]; } public readonly static object[] emptystringarray = { }; private object[] createdatarowparams(string line, int maxlength) { var raw = line.split('\t'); var length = raw.length - 1; if (length == 0 || maxlength == 0) return emptystringarray; if (length > maxlength) length = maxlength; var values = new string[length]; for (var i = 0; i < length; i++) { values[i] = raw[i + 1]; } if (values[values.length - 1].endswith("\n")) { values[values.length - 1] = values[values.length - 1].substring(0, values[values.length - 1].lastindexof('\n')); } else if (values[values.length - 1].endswith("\n\r")) { values[values.length - 1] = values[values.length - 1].substring(0, values[values.length - 1].lastindexof("\n\r", stringcomparison.ordinal)); } else if (values[values.length - 1].endswith("\r")) { values[values.length - 1] = values[values.length - 1].substring(0, values[values.length - 1].lastindexof('\r')); } return values; } protected virtual void dispose(bool cleanall) { _iifset?.dispose(); } public void dispose() { dispose(true); gc.suppressfinalize(this); }
总结
好了,本文的内容到这就结束了,有关dataset的一些常用的操作,基本属性和方法在这里就不做介绍了。希望本文的内容对大家的学习或者工作能带来一定的帮助。
上一篇: 文本框只能选择数据到文本框禁止手动输入