C#/.NET应用程序编程开发中如何将一个CSV文件的内容读取到C#的DataTable中呢?

C#开发 作者: Rector 6 次阅读 · 读完约需 1 分钟 收藏本文

郑重申明:本文未经许可,禁止任何形式转载

问题描述

假如有一个准备好的CSV文件,现需要将其中的内容读取到C#的DataTable中,在C#/.NET应用程序编程开发中如何实现呢?

方案一

使用第三方组件,这里为大家推荐的CSV文件帮助组件是:GenericParser

根据名称可以看出,这是一个泛型的CSV文件解析工具,GenericParser具有如下的特性:

  • 支持分隔和固定宽度格式
  • 支持自定义分隔符字符(仅支持单个字符)
  • 支持注释行(单个字符标记)
  • 支持转义字符(仅支持单个字符)
  • 支持自定义文本限定符,允许忽略列/行分隔符(例如,多行数据)
  • 通过将转义文本限定符加倍来支持它们
  • 支持忽略/包含不包含字符的行
  • 支持标题行
  • 支持动态添加更多列以匹配数据的功能
  • 支持将列的数目强制为特定数目
  • 其他更多特性…

使用示例如下:

DataSet dsResult;

// 从xml文件加载解析器的配置参数 
using (GenericParserAdapter parser = new GenericParserAdapter("MyData.txt"))
{
    parser.Load("MyData.xml");
    dsResult = parser.GetDataSet();
}

// 或者以编程的方式配置解析器选项 
string strID, strName, strStatus;
using (GenericParser parser = new GenericParser())
{
    parser.SetDataSource("MyData.txt");

    parser.ColumnDelimiter = "\t".ToCharArray();
    parser.FirstRowHasHeader = true;
    parser.SkipStartingDataRows = 10;
    parser.MaxBufferSize = 4096;
    parser.MaxRows = 500;
    parser.TextQualifier = '\"';

    while (parser.Read())
    {
      strID = parser["ID"];
      strName = parser["Name"];
      strStatus = parser["Status"];
    }
}

// 编程方式设置列宽 
  using (GenericParser parser = new GenericParser())
  {
    parser.SetDataSource("MyData.txt");

    parser.ColumnWidths = new int[4] {10, 10, 10, 10};
    parser.SkipStartingDataRows = 10;
    parser.MaxRows = 500;

    while (parser.Read())
    {
      strID = parser["ID"];
      strName = parser["Name"];
      strStatus = parser["Status"];
    }
}

方案二

使用OleDb提供程序读取CSV文件,如下:


using System.Data;
using System.Data.OleDb;
using System.Globalization;
using System.IO;

static DataTable GetDataTableFromCsv(string path, bool isFirstRowHeader)
{
    string header = isFirstRowHeader ? "Yes" : "No";

    string pathOnly = Path.GetDirectoryName(path);
    string fileName = Path.GetFileName(path);

    string sql = @"SELECT * FROM [" + fileName + "]";

    using(OleDbConnection connection = new OleDbConnection(
              @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathOnly + 
              ";Extended Properties=\"Text;HDR=" + header + "\""))
    using(OleDbCommand command = new OleDbCommand(sql, connection))
    using(OleDbDataAdapter adapter = new OleDbDataAdapter(command))
    {
        DataTable dataTable = new DataTable();
        dataTable.Locale = CultureInfo.CurrentCulture;
        adapter.Fill(dataTable);
        return dataTable;
    }
}

方案三

使用文件流StreamReader读取CSC文件,然后手动分割每一行数据,如下:

public static DataTable ConvertCSVtoDataTable(string strFilePath)
{
    DataTable dt = new DataTable();
    using (StreamReader sr = new StreamReader(strFilePath))
    {
        string[] headers = sr.ReadLine().Split(',');
        foreach (string header in headers)
        {
            dt.Columns.Add(header);
        }
        while (!sr.EndOfStream)
        {
            string[] rows = sr.ReadLine().Split(',');
            DataRow dr = dt.NewRow();
            for (int i = 0; i < headers.Length; i++)
            {
                dr[i] = rows[i];
            }
            dt.Rows.Add(dr);
        }

    }
    return dt;
}

阅读了该文章的人还浏览了...

本文永久链接码友网 » C#/.NET应用程序编程开发中如何将一个CSV文件的内容读取到C#的DataTable中呢?

发布于: 2019-07-02 10:03:32
分享扩散:

发表评论

登录用户才能发表评论, 请 登 录 或者 注册