C# Csv 操作
C# Csv 操作
下载
API
Example
| 实例小结 | 描述 |
|---|---|
| Prerequisites | 这些是.NET基础知识(流的使用和释放/文件读取和写入) |
| Reading | 读取Csv |
| Writing | 写入Csv |
| Configuration | 配置Csv Helper的行为以使用Csv数据或自定义类结构 |
| Type Conversion | 使用类型转换将CSV字段转换为.NET类型和从.NET类型转换CSV字段 |
| CsvDataReader | 使用数据表读取CSV数据。 |
快速开始
读一个文件
/**
* 包含变标题的csv文件 file.csv
* Id,Name
* 1,one
* 2,two
*/
// 一个类定义
public class Foo
{
public int Id { get; set; }
public string Name { get; set; }
}
// 类属性名称与CSV文件头名称匹配,我们可以在不进行任何配置的情况下读取文件。
using (var reader = new StreamReader("path\\to\\file.csv"))
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
var records = csv.GetRecords<Foo>();
}
/**
* 不包含变标题的csv文件 file.csv
* 1,one
* 2,two
*/
// 首先,我们需要使用配置告诉读取器没有头记录。
var config = new CsvConfiguration(CultureInfo.InvariantCulture)
{
HasHeaderRecord = false,
};
using (var reader = new StreamReader("path\\to\\file.csv"))
using (var csv = new CsvReader(reader, config))
{
var records = csv.GetRecords<Foo>();
}
// 一个类定义使用属性映射
// 索引属性允许您指定CSV字段要用于属性的位置。
public class Foo
{
[Index(0)]
public int Id { get; set; }
[Index(1)]
public string Name { get; set; }
}
// 也可以使用上面 使用名称映射位置
public class Foo
{
[Name("id")]
public int Id { get; set; }
[Name("name")]
public string Name { get; set; }
}
// 将Csv 数据填充 表单
using (var reader = new StreamReader("path\\to\\file.csv"))
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
// Do any configuration to `CsvReader` before creating CsvDataReader.
using (var dr = new CsvDataReader(csv))
{
var dt = new DataTable();
dt.Load(dr);
}
}
// 指定表单行列类型
using (var reader = new StreamReader("path\\to\\file.csv"))
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
// Do any configuration to `CsvReader` before creating CsvDataReader.
using (var dr = new CsvDataReader(csv))
{
var dt = new DataTable();
dt.Columns.Add("Id", typeof(int));
dt.Columns.Add("Name", typeof(string));
dt.Load(dr);
}
}
// 使用 Enumerate
void Main()
{
using (var reader = new StreamReader("path\\to\\file.csv"))
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
var record = new Foo();
var records = csv.EnumerateRecords(record);
foreach (var r in records)
{
// r是与记录相同的实例。
}
}
}
public class Foo
{
public int Id { get; set; }
public string Name { get; set; }
}
写一个文件
// 定义一个类结构
public class Foo
{
public int Id { get; set; }
public string Name { get; set; }
}
// 初始化 类结构列表
var records = new List<Foo>
{
new Foo { Id = 1, Name = "one" },
new Foo { Id = 2, Name = "two" },
};
// 将其写入文件
using (var writer = new StreamWriter("path\\to\\file.csv"))
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
{
csv.WriteRecords(records);
}
// 定义一个类映射结构
public class FooMap : ClassMap<Foo>
{
public FooMap()
{
Map(m => m.Id).Index(0).Name("id");
Map(m => m.Name).Index(1).Name("name");
}
}
// 写入每一行数据
using (var writer = new StreamWriter("path\\to\\file.csv"))
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
{
csv.WriteHeader<Foo>();
csv.NextRecord();
foreach (var record in records)
{
csv.WriteRecord(record);
csv.NextRecord();
}
}
以下是一个简单的Csv解析插件
using System;
using System.Collections;
using System.Text;
using System.IO;
using System.Collections.Generic;
using System.Text.RegularExpressions;
public class CsvHelper
{
/// <summary>
/// 字符串是否包含奇数个引号
/// </summary>
/// <param name="str">相关字符串</param>
/// <returns></returns>
private static bool _isOddDoubleQuota(string str)
{
return _getDoubleQuotaCount(str) % 2 == 1;
}
private static int _getDoubleQuotaCount(string str)
{
string[] strArray = str.Split('"');
int doubleQuotaCount = strArray.Length - 1;
doubleQuotaCount = doubleQuotaCount < 0 ? 0 : doubleQuotaCount;
return doubleQuotaCount;
}
/// <summary>
/// 从字符串解析 Csv
/// </summary>
/// <param name="csvInfo"></param>
/// <returns></returns>
public static Dictionary<int, List<string>> AnalysisCsvByStr(string csvInfo)
{
Dictionary<int, List<string>> csvInfoDic = new Dictionary<int, List<string>>();
Regex regex = new Regex(@"\r\n");
string[] infoLines = regex.Split(csvInfo);
int Rows = 0;
for (int i = 0; i < infoLines.Length; i++)
{
if (string.IsNullOrEmpty(infoLines[i]))
{
continue;
}
string[] lineInfoArray = infoLines[i].Split(',');
List<string> rowItemList = new List<string>();
string strTemp = string.Empty;
for (int j = 0; j < lineInfoArray.Length; j++)
{
strTemp += lineInfoArray[j];
if (_isOddDoubleQuota(strTemp))
{
if (j != lineInfoArray.Length - 1)
{
strTemp += ",";
}
}
else
{
if (strTemp.StartsWith("\"") && strTemp.EndsWith("\""))
{
strTemp = strTemp.Substring(1, strTemp.Length - 2);
}
rowItemList.Add(strTemp);
strTemp = string.Empty;
}
}
csvInfoDic.Add(Rows++, rowItemList);
}
return csvInfoDic;
}
/// <summary>
/// 从文件解析Csv
/// </summary>
/// <param name="csvPath"></param>
/// <returns></returns>
public static Dictionary<int, List<string>> AnalysisCsvByFile(string csvPath)
{
if (File.Exists(csvPath))
{
string csvInfo = File.ReadAllText(csvPath, Encoding.UTF8);
return AnalysisCsvByStr(csvInfo);
}
else
{
throw new FileNotFoundException("未找到文件:" + csvPath);
}
}
}

浙公网安备 33010602011771号