C# | 超簡單CSV表格讀寫操作(輕松將數據保存到CSV,并支持讀取還原)
文章目錄
- C# | 超簡單CSV表格讀寫操作(輕松將數據保存到CSV,并支持讀取還原)
- 一、上位機開發中的CSV應用背景
- 二、CSV讀寫實戰教學
- 1. 基本對象序列化
- 2. 多數據類型處理
- 3. 集合類型序列化
- 4. 二進制數據處理
- 5. 自定義類型支持
- 6. 表頭自定義
- 7. 屬性忽略
- 8. 大文件完整讀寫測試
- 三、安裝部署指南
- 四、感謝閱讀
一、上位機開發中的CSV應用背景
在工業自動化上位機開發中,CSV格式數據的生成與解析是常見的核心需求:
- 用于設備運行數據的長期記錄
- 實現與其他系統(如MES/ERP)的數據交換
- 生成可人工查閱的生產報表
- 調試階段數據快照保存
傳統方式通過硬編碼拼接字符串效率低下,且難以處理復雜數據結構。本文將講解如何使用CsvSerializer類輕松實現CSV文件的生成和讀取。
二、CSV讀寫實戰教學
1. 基本對象序列化
/// <summary>
/// 基本學生信息類
/// </summary>
public class SimpleStudent
{public int Id { get; set; }public string Name { get; set; }
}var students = new List<SimpleStudent>
{new SimpleStudent { Id = 1001, Name = "張三" },new SimpleStudent { Id = 1002, Name = "李四" }
};var csv = new CsvSerializer().ConvertToCsvLines(students);
File.WriteAllLines("simple_students.csv", csv);
2. 多數據類型處理
/// <summary>
/// 復合數據類型演示類
/// </summary>
public class DataTypeDemo
{public DateTime RecordTime { get; set; } // 時間類型public float Temperature { get; set; } // 精確數值public bool IsValid { get; set; } // 布爾類型
}var data = new DataTypeDemo
{RecordTime = DateTime.Now,Temperature = 25.36f,IsValid = true
};var serializer = new CsvSerializer();
File.WriteAllLines("data_types.csv", serializer.ConvertToCsvLines(new[] { data }));
3. 集合類型序列化
public class CollectionDemo
{public int[] SensorValues { get; set; } // 整型數組public List<double> Voltages { get; set; } // 泛型列表
}var demo = new CollectionDemo
{SensorValues = new[] { 100, 200, 300 },Voltages = new List<double> { 3.3, 5.0, 12.0 }
};// 生成CSV時集合元素自動以分號分隔
var csvLines = new CsvSerializer().ConvertToCsvLines(new[] { demo });
4. 二進制數據處理
public class BinaryData
{public byte[] ImageBuffer { get; set; } // Base64編碼存儲
}var data = new BinaryData
{ImageBuffer = File.ReadAllBytes("logo.png")
};// 生成文件提示:大量二進制數據存入單行可能導致Excel無法打開
File.WriteAllLines("data_binary.csv", serializer.ConvertToCsvLines(new[] { data }));
5. 自定義類型支持
// 定義新的結構體類型
public struct Coordinate
{public double X;public double Y;
}// 測試類型
public class CustomTypeDemo
{ public Coordinate Position { get; set; }
}// 注冊自定義轉換器
var serializer = new CsvSerializer();
serializer.Converters.Add(typeof(Coordinate), new StringConverter<Coordinate>(str =>{var parts = str.Split('|');return new Coordinate { X = double.Parse(parts[0]), Y = double.Parse(parts[1]) };},c => $"{c.X}|{c.Y}"
));
6. 表頭自定義
public class MachineData
{[CsvColumn("Current Speed (m/min)")]public double Speed { get; set; }[CsvColumn("Working Temp (°C)")]public double Temperature { get; set; }
}// 生成的CSV標題類似:
// Current Speed (m/min),Working Temp (°C)
7. 屬性忽略
public class SecurityData
{public string PublicInfo { get; set; }[CsvIgnore]public string SecretKey { get; set; } // 不會出現在CSV中
}
8. 大文件完整讀寫測試
生成用于測試的隨機學生信息表CSV文件:
/// <summary>/// 生成學生信息表/// </summary>public void GenerateTestCsvFile(){var serializer = new CsvSerializer();const int dataSize = 1000;var random = new Random();var students = Enumerable.Range(0, dataSize).Select(_ => GenerateRandomStudent(random)).ToList();var csv = serializer.ConvertToCsvLines(students);File.WriteAllLines("test_data.csv", csv);// 打開文件夾Process.Start("explorer.exe", "/select," + Path.GetFullPath("test_data.csv"));Console.WriteLine($"已生成測試數據文件:{Path.GetFullPath("test_data.csv")}");}/// <summary>/// 生成隨機學生數據/// </summary>private static Student GenerateRandomStudent(Random random){return new Student{// 基礎類型Id = random.Next(10000, 99999),Name = $"Student_{random.Next(1, 1000)}",GPA = Math.Round(random.NextDouble() * 4.0, 2),// 結構體類型Location = new Point(random.Next(0, 100), random.Next(0, 100)),ClassSize = new Size(random.Next(30, 60), random.Next(20, 40)),// 集合類型Marks = Enumerable.Range(0, 5).Select(_ => random.Next(60, 100)).ToArray(),Courses = new List<string>{$"Course_{random.Next(100, 999)}",$"Course_{random.Next(100, 999)}",$"Course_{random.Next(100, 999)}"},// 特殊類型Grade = (char)('A' + random.Next(0, 5))};}/// <summary>/// 測試用學生類(覆蓋8種不同數據類型)/// </summary>private class Student{// 基礎值類型public int Id { get; set; }// 字符串類型public string Name { get; set; }// 浮點類型public double GPA { get; set; }// 結構體類型(Point)public Point Location { get; set; }// 結構體類型(Size)public Size ClassSize { get; set; }// 數組類型public int[] Marks { get; set; }// 泛型集合public List<string> Courses { get; set; }// 字符類型public char Grade { get; set; }}
讀取CSV文件,還原成對象數組:
// 讀取還原數據
var serializer = new CsvSerializer();
var loadedData = serializer.ConvertFromCsvLines<Student>(File.ReadAllLines("test_data.csv"));
三、安裝部署指南
通過NuGet包管理器安裝:
通過NuGet包管理器執行:
Install-Package STTech.CodePlus
或使用.NET CLI:
dotnet add package STTech.CodePlus
四、感謝閱讀
感謝各位讀者耐心閱讀,本庫將持續迭代工業領域實用組件。如有建議可評論區留言,期待您的使用反饋!