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);
}
}
}
posted @   镜子-眼泪  阅读(628)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
欢迎阅读『C# Csv 操作』

喜欢请打赏

扫描二维码打赏

了解更多

点击右上角即可分享
微信分享提示