Friday, July 17, 2015 1:43 PM

Every time I need to work with the contents of text-based files in an ASP.NET application I invariably start off thinking about using the various static methods on the System.IO.File class to extract the text and then some string manipulation or Regex to parse the content into some kind of structure. And, just in time, I remember the TextFieldParser class that hides itself away in the Microsoft.VisualBasic assembly. The purpose of this article is to introduce this component to a wider audience, but also to serve me as an aide-mémoire in terms of the basic usage, which I always have to look up.

The Microsoft.VisualBasic library is a collection of namespaces containing a miscellany of components and utilities. Most of them seem to provide VB6 developers with something that they will be familiar with such as .NET implementations of the string-related Left and Right methods, but despite its name (and the fact that MSDN examples are all VB-only), the library is pure .NET code and can be used with any .NET compliant language. C# projects do not include a reference to Microsoft.VisualBasic by default, so you need to use the Add References dialog to add it yourself:

TextFieldParser instance can be initialised from a number of sources: a stream, a physical file on disk, or aTextReader. The first two options are likely to be used more often in ASP.NET applications. This first example illustrates creating a TextFieldParser from an uploaded file in an MVC application:

[HttpPost]
public ActionResult Index(HttpPostedFileBase file)
{
if (file != null)
{
if (file.ContentLength > 0)
{
using (var parser = new TextFieldParser(file.InputStream))
{
// ...
}
}
}
return View();
}

The TextFieldParser is instantiated within a using block because it implements IDisposable, and the usingblock ensures that the object will be displosed of safely and correctly. The next example sees a file path passed to the TextFieldParser constructor:

var file = @"C:\test.csv";
using (var parser = new TextFieldParser(file))
{
//..
}

Finally, here's an example of the constructor that accepts a concrete implementation of the TextReader:

var csv = @"1,Mike,Brind,www.mikesdotnetting.com";
using (var parser = new TextFieldParser(new StringReader(csv)))
{
// ...
}

Configuration

Configuration options are set through properties and methods. The key options are featured below:

Option Description Default
Delimiters (property) Specifies the field delimiters used in the text file. null
SetDelimiters (method) Alterntative way to specify the field delimiters used in the file  
TextFieldType (property) Specify whether the file is Delimited orFixedWidth TextFieldType.Delimited
HasFieldsEnclosedInQuotes(property) Boolean indicating whether text fields are enclosed in quotes true
FieldWidths (property) An array of ints specifying the widths of individual fields in a fixed width file null
SetFieldWidths (method) An alternative way to specify the widths of individual fields in a fixed width file  
CommentTokens (property) An array specifying the tokens used to indicate comments in the file null
TrimWhiteSpace (property) Boolean indicating whether leading and trailing white space should be removed from fields true

Having instantiated and configured a TextFieldParser, you will want to start accessing the data in the text file. The parser has a ReadFields method that gobbles up content a line at a time. It returns an array of strings. It also has an EndOfData property which indicates whether there are any more lines of data to be read. The following code shows how to use this property and method in combination to read each line of data in a simple example:

var data = @"1,Potato,Vegetable
2,Strawberry,Fruit
3,Carrot,Vegetable
4,Milk,Dairy,
5,Apple,Fruit
6,Bread,Cereal"; using (var parser = new TextFieldParser(new StringReader(data)))
{
parser.Delimiters = new[] { "," };
while (!parser.EndOfData)
{
var row = parser.ReadFields();
var foodType = row[2];
}
}

The sample above doesn't have a header. The following sample features the same data with a header row, and illustrates how to copy the whole thing into a DataTable:

var data = @"Id,Food,FoodType
1,Potato,Vegetable
2,Strawberry,Fruit
3,Carrot,Vegetable
4,Milk,Dairy,
5,Apple,Fruit
6,Bread,Cereal"; using (var parser = new TextFieldParser(new StringReader(data)))
{
var headerRow = true;
var dt = new DataTable(); parser.Delimiters = new[] { "," }; while (!parser.EndOfData)
{
var currentRow = parser.ReadFields();
if (headerRow)
{
foreach (var field in currentRow)
{
dt.Columns.Add(field, typeof(object));
}
headerRow = false;
}
else
{
dt.Rows.Add(currentRow);
}
}
}

The final example shows how to apply the CommentTokens property to be able to read a standard IIS log file into aDataTable where comment lines are prefixed with a hash (#) symbol:

var file = @"C:\Logs\W3SVC6\ex140210.log";
var commentTokens = new[] { "#" };
var headerRow = File.ReadAllLines(file).First(l => l.StartsWith("#Fields:"));
using (var parser = new TextFieldParser(file))
{
var dt = new DataTable();
var columns = headerRow.Replace("#Fields: ", string.Empty).Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
foreach (var column in columns)
{
dt.Columns.Add(column, typeof(object));
}
parser.SetDelimiters(" ");
parser.CommentTokens = commentTokens;
while (!parser.EndOfData)
{
{
dt.Rows.Add(parser.ReadFields());
}
}
}

In this case, because the parser is configured to ignore lines beginning with the specified comment token, a bit of additional code is used to extract the field headers for the DataTable column names.

Summary

Next time you need to parse a text file in a .NET application, rather than reaching for string manipulation functions, you could consider using the TextFieldParser in the Microsoft.VisualBasic library.

原文链接:http://www.mikesdotnetting.com/article/279/reading-text-based-files-in-asp-net

Reading Text-based Files In ASP.NET的更多相关文章

  1. AsciiDoc Text based document generation

    AsciiDoc Text based document generation    AsciiDoc Home Page http://asciidoc.org/   AsciiDoc is a t ...

  2. How to easily concatenate text based on criteria in Excel? 如何将Excel中的文本按条件合并

    To combine text with the unique ID numbers, you can extract the unique values first and then create ...

  3. Adding Cache-Control headers to Static Files in ASP.NET Core

    Thanks to the ASP.NET Core middleware pipeline, it is relatively simple to add additional HTTP heade ...

  4. Reading Text from Images Using C#

    Introduction By using Optical Character Recognition (OCR), you can detect and extract handwritten an ...

  5. Upload Files In ASP.NET Core 1.0 (Form POST And JQuery Ajax)

    Uploading files is a common requirement in web applications. In ASP.NET Core 1.0 uploading files and ...

  6. PostgreSQL Reading Ad Writing Files、Execution System Instructions Vul

    catalog . postgresql简介 . 文件读取/写入 . 命令执行 . 影响范围 . 恶意代码分析 . 缓解方案 1. postgresql简介 PostgreSQL 是一个自由的对象-关 ...

  7. HTTP based RESTful APIs - asp.net web api

    1.HTTP http://www.w3.org/Protocols/rfc2616/rfc2616.html 2.REST是什么http://www.ics.uci.edu/~fielding/pu ...

  8. Uploading files using ASP.NET Web Api

    http://chris.59north.com/post/Uploading-files-using-ASPNET-Web-Api

  9. Suspended Animation——《The Economist》阅读积累(考研英语二·2010 Reading Text 1)

    [知识小百科] Damien Hirst(达米恩●赫斯特):生于1965年,是新一代英国艺术家的主要代表人物之一.他主导了90年代英国艺术发展并享有很高的国际声誉.赫斯特在1986年9月就读于伦敦大学 ...

随机推荐

  1. C#反射 -- 基础

    两个现实中的例子:1.B超:大家体检的时候大概都做过B超吧,B超可以透过肚皮探测到你内脏的生理情况.这是如何做到的呢?B超是B型超声波,它可以透过肚皮通过向你体内发射B型超声波,当超声波遇到内脏壁的时 ...

  2. FTP上传失败报错227 Entering Passive Model (222,111,8,111,10,40)

    昨天为了一个ftp问题折腾了一天.问题背景:原来有个接口涉及到上传文件,服务端更换了ftp服务器,我们这边需要刷新连接服务端的ip和端口配置,代码没动.联调环境和验收环境都测试通过,一到生产环境就歇菜 ...

  3. MySQL-5.7中InnoDB表数据文件存储位置

    学习地址:https://www.cnblogs.com/tongxiaoda/p/7874535.html

  4. CentOS7上部署https

    目前很多浏览器都加强了html都安全性,要求配置https. 下面都例子是在CentOS7上的Apache配置https都过程. 一.生成证书 用OpenSSL生成key和证书: mkdir /etc ...

  5. FIR滤波器和IIR滤波器的区别

    数字滤波器广泛应用于硬件电路设计,在离散系统中尤为常见,一般可以分为FIR滤波器和IIR滤波器,那么他们有什么区别和联系呢. FIR滤波器 定义: FIR滤波器是有限长单位冲激响应滤波器,又称为非递归 ...

  6. PHP面向对象深入研究之【组合模式与装饰模式】

    组合模式 定义:组合模式定义了一个单根继承体系,使具有截然不同职责的集合可以并肩工作. 一个军队的案例, <?php abstract class Unit { // 个体 abstract f ...

  7. python开发mysql:索引

    一,索引管理 索引分类: 普通索引INDEX:加速查找 唯一索引: -主键索引PRIMARY KEY:加速查找+约束(不为空.不能重复) -唯一索引UNIQUE:加速查找+约束(不能重复) 联合索引: ...

  8. node.js的了解

    在node环境上面运行js代码,js相当于php,node相当于apache环境 第一步装 node 环境1.从官网下载 dmg 文件安装 2.通过命令行安装 需要用到 homebrew(mac上专门 ...

  9. 代码说明call和apply方法的区别 (咱们这方面讲解的少,这样的题有变式,需要举例讲解一下)

    这两个都是函数的方法,可以改变this的指向,fn.call(obj,param1,param2,…) call传入单个参数 fn.apply(obj,[param1,param2,...]) app ...

  10. php 中php-fpm 的重启、终止操作命令

    php 中php-fpm 的重启.终止操作命令: service nginx restart service php-fpm restart 查看php-fpm进程数:ps aux | grep -c ...