欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

.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的一些常用的操作,基本属性和方法在这里就不做介绍了。希望本文的内容对大家的学习或者工作能带来一定的帮助。