项目中比较多的会对文件进行操作,例如文件的上传下载,文件的压缩和解压等IO操作。在.NET项目中较多的会使用DataSet,DataTable进行数据的缓存。

项目中对文本文件的操作比较简单,但是如果需要将文本文件的内容写入系统的缓存中,操作起来,会稍微的繁琐一些。现在总结一个较为通用的方法,将文本文件的内容缓存进入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 = ; 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) != -)
{
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')[];
var parameters = CreateDataRowParams(line, set.Tables[tablename].Columns.Count);
if (parameters.Length > )
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')[];
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[] = values[].Substring();
var dt = new DataTable(values[]);
values[] = 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[].StartsWith("!"))
{
values[] = values[].Substring();
}
return values[];
} public readonly static object[] EmptyStringArray = { }; private object[] CreateDataRowParams(string line, int maxLength)
{
var raw = line.Split('\t');
var length = raw.Length - ;
if (length == || maxLength == )
return EmptyStringArray;
if (length > maxLength)
length = maxLength;
var values = new string[length];
for (var i = ; i < length; i++)
{
values[i] = raw[i + ];
} if (values[values.Length - ].EndsWith("\n"))
{
values[values.Length - ] = values[values.Length - ].Substring(, values[values.Length - ].LastIndexOf('\n'));
}
else if (values[values.Length - ].EndsWith("\n\r"))
{
values[values.Length - ] = values[values.Length - ].Substring(, values[values.Length - ].LastIndexOf("\n\r", StringComparison.Ordinal));
}
else if (values[values.Length - ].EndsWith("\r"))
{
values[values.Length - ] = values[values.Length - ].Substring(, values[values.Length - ].LastIndexOf('\r'));
} return values;
} protected virtual void Dispose(bool cleanAll)
{
_iifSet?.Dispose();
} public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}

有关dataset的一些常用的操作,基本属性和方法在这里就不做介绍了。

将文本文件的内容存储在DataSet中的方法总结的更多相关文章

  1. 【HANA系列】SAP UI5上传图片 用XSJS存储在HANA中的方法

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP UI5上传图片 用XSJ ...

  2. 哈希算法和字典类的定义,DataSet中数据遍历的几种方法

    哈希算法的基本操作: 1.  哈希表(HashTable)简述   在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似 ...

  3. Java中的方法和方法重载

    上次我们讲了Java中的一些基本的语法;今天我们就讲一点内容,来说说Java中的方法和方法重载以及需要注意的一些地方; 方法: Java的方法类似与其他语言的函数,是一段用来完成特定功能的代码片段, ...

  4. Java基础知识强化之IO流笔记46:IO流练习之 把文本文件中数据存储到集合中的案例

    1.  把文本文件中数据存储到集合中      需求:从文本文件中读取数据(每一行为一个字符串数据)到集合中,并遍历集合. 分析:      通过题目的意思我们可以知道如下的一些内容,      数据 ...

  5. 使用Hive或Impala执行SQL语句,对存储在Elasticsearch中的数据操作

    http://www.cnblogs.com/wgp13x/p/4934521.html 内容一样,样式好的版本. 使用Hive或Impala执行SQL语句,对存储在Elasticsearch中的数据 ...

  6. 将spfile存储在ASM中

    数据库的spfile开始是存储在普通的文件系统中,如下所示: SQL> show parameter spfile NAME TYPE VALUE ----------------------- ...

  7. 使用OpenXML将Excel内容读取到DataTable中

    前言:前面的几篇文章简单的介绍了如何使用OpenXML创建Excel文档.由于在平时的工作中需要经常使用到Excel的读写操作,简单的介绍下使用 OpenXML读取Excel中得数据.当然使用Open ...

  8. ubuntu 把终端信息输出到文本文件中的方法

    方法一:把终端中所有信息都写到文本文件中 在终端的命令行中输入以下命令: $   script   -f    output.txt 这样就会在当前目录下创建一个output.txt文件 接下来,在按 ...

  9. 爬取豆瓣电影TOP 250的电影存储到mongodb中

    爬取豆瓣电影TOP 250的电影存储到mongodb中 1.创建项目sp1 PS D:\scrapy> scrapy.exe startproject douban 2.创建一个爬虫 PS D: ...

随机推荐

  1. 完美解决 Linux 下 Sublime Text 中文输入

    首先,我参考了好几篇文章,都是蛮不错的,先列出来: sublime-text-imfix:首先推荐这个方法,最简单,但是在我的系统上有些问题.可用这个的强烈推荐用这个 完美解决 Linux 下 Sub ...

  2. ORM数据层框架的设计热点:更新指定的列的几种设计方案

    ORM框架的定义:对象-关系映射(Object/Relation Mapping,简称ORM) 常见的是:数据库结构=>映射Object(实体属性)=>基于实体类的操作. 还有一种:数据库 ...

  3. 基于腾讯手Q样式规范Frozen UI

    Frozen UI是一个开源的简单易用,轻量快捷的移动端UI框架.基于手Q样式规范,选取最常用的组件,做成公用离线包减少请求,升级方式友好,文档完善,目前全面应用在腾讯手Q增值业务中. css组件包括 ...

  4. 【php爬虫】百万级别知乎用户数据爬取与分析

    代码托管地址:https://github.com/hoohack/zhihuSpider 这次抓取了110万的用户数据,数据分析结果如下: 开发前的准备 安装Linux系统(Ubuntu14.04) ...

  5. UI控件(UISlider)

    @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; UISlider* slider = [[UISli ...

  6. iOS开发系列--Objective-C之KVC、KVO

    概述 由于ObjC主要基于Smalltalk进行设计,因此它有很多类似于Ruby.Python的动态特性,例如动态类型.动态加载.动态绑定等.今天我们着重介绍ObjC中的键值编码(KVC).键值监听( ...

  7. 记录Office Add-in开发经验

    原创文章转载请注明出处:@协思, http://zeeman.cnblogs.com 得益于微软系强大的共通能力和Visual Studio的开发支持,做Office插件不是什么难事.一点经验记录如下 ...

  8. 跟vczh看实例学编译原理——零:序言

    在<如何设计一门语言>里面,我讲了一些语言方面的东西,还有痛快的喷了一些XX粉什么的.不过单纯讲这个也是很无聊的,所以我开了这个<跟vczh看实例学编译原理>系列,意在科普一些 ...

  9. Node.js返回JSONP

    在使用JQuery的Ajax从服务器请求数据或者向服务器发送数据时常常会遇到跨域无法请求的错误,常用的解决办法就是在Ajax中使用JSONP.基于安全性考虑,浏览器会存在同源策略,然而<scri ...

  10. 《App研发录》面世

    古者富贵而名灭,不可胜记,唯倜傥非常之人称焉.故西伯拘而演<周易>,屈原放逐,乃赋<离骚>.文人雅士一次次的谱写着千古绝唱,而我亦不能免俗,也要附庸风雅,写一部前不见古人.后不 ...