C#中实现类似Pandas read_csv读取指定分隔符CSV到DataTable的方法
用CsvHelper快速将指定分隔符的CSV读取到DataTable
我太懂你想要的那种“一行式”简洁感了——就像Pandas的pandas.read_csv()那样,不用提前定义复杂结构,直接把CSV转成DataTable对吧?其实用CsvHelper完全能实现类似的效果,而且步骤也很简单,我给你整理两种实用的写法:
方法一:最贴近Pandas风格的简洁写法
这种方式借助CsvHelper.Data扩展包的CsvDataReader,可以直接让DataTable加载CSV数据,几乎和你想象的代码结构一致:
首先确保你已经通过NuGet安装了两个包:CsvHelper和CsvHelper.Data。
然后写代码:
using CsvHelper; using CsvHelper.Configuration; using CsvHelper.Data; using System.Data; using System.Globalization; string csvPath = "myPath.csv"; // 配置CSV的分隔符和其他规则 var csvConfig = new CsvConfiguration(CultureInfo.InvariantCulture) { Delimiter = "|", // 指定你的分隔符 HasHeaderRecord = true // 如果CSV第一行是表头,设为true;没有表头就设为false }; using (var streamReader = new StreamReader(csvPath)) using (var csvReader = new CsvReader(streamReader, csvConfig)) using (var csvDataReader = new CsvDataReader(csvReader)) { DataTable dt = new DataTable(); dt.Load(csvDataReader); // 这一步就完成了加载,和Pandas的read_csv异曲同工 }
方法二:手动控制列和行的加载(适合需要自定义处理的场景)
如果需要对列类型、数据做额外处理,这种方式更灵活:
using CsvHelper; using CsvHelper.Configuration; using System.Data; using System.Globalization; string csvPath = "myPath.csv"; var csvConfig = new CsvConfiguration(CultureInfo.InvariantCulture) { Delimiter = "|" }; using (var streamReader = new StreamReader(csvPath)) using (var csvReader = new CsvReader(streamReader, csvConfig)) { DataTable dt = new DataTable(); // 先根据CSV表头创建DataTable的列 csvReader.Read(); csvReader.ReadHeader(); foreach (var header in csvReader.HeaderRecord) { // 这里可以自定义列类型,比如dt.Columns.Add(header, typeof(int)) dt.Columns.Add(header); } // 逐行读取并填充DataTable while (csvReader.Read()) { DataRow row = dt.NewRow(); for (int i = 0; i < csvReader.Context.Record.Length; i++) { row[i] = csvReader.Context.Record[i]; // 这里可以对每个单元格的数据做转换处理 } dt.Rows.Add(row); } }
这两种写法都能满足你的需求,第一种更简洁,和Pandas的用法最接近;第二种适合需要自定义数据处理的场景。
内容的提问来源于stack exchange,提问作者Mwspencer
相关产品推荐
相关产品推荐

