C# Csv 操作
下载
读一个文件
| |
| |
| |
| |
| |
| |
| |
| |
| public class Foo |
| { |
| public int Id { get; set; } |
| public string Name { get; set; } |
| } |
| |
| |
| using (var reader = new StreamReader("path\\to\\file.csv")) |
| using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture)) |
| { |
| var records = csv.GetRecords<Foo>(); |
| } |
| |
| |
| |
| |
| |
| |
| |
| 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>(); |
| } |
| |
| |
| |
| 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; } |
| } |
| |
| using (var reader = new StreamReader("path\\to\\file.csv")) |
| using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture)) |
| { |
| |
| 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)) |
| { |
| |
| 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); |
| } |
| } |
| |
| 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) |
| { |
| |
| } |
| } |
| } |
| |
| 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 |
| { |
| |
| |
| |
| |
| |
| 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; |
| } |
| |
| |
| |
| |
| |
| |
| 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; |
| } |
| |
| |
| |
| |
| |
| |
| 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); |
| } |
| } |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构