编辑
2025-02-03
C# 应用
00
请注意,本文编写于 92 天前,最后修改于 92 天前,其中某些信息可能已经过时。

目录

设计通用CSV导入与导出类
CsvHelper类
使用示例
导出数据示例
导入数据示例
结论

这个版本完善了一下对特殊字符的处理,在现代应用程序中,CSV(Comma-Separated Values)格式是数据导入和导出的常见选择。这是由于CSV简单、易读、跨平台的特性。然而,当处理包含特殊字符的数据时,可能会出现一些复杂性。在这篇文章中,我们将设计一个通用的C#类来处理CSV文件中的导入和导出,包括对特殊字符的处理。

设计通用CSV导入与导出类

我们将创建一个名为CsvHelper的类,其中包含用于导入和导出CSV文件的功能。这些功能将确保数据中包含的特殊字符(如引号、逗号和换行符等)可以被正确地处理。

CsvHelper类

C#
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace AppCsv { public class CsvHelper { // 定义CSV分隔符和引用字符 private const char Delimiter = ','; private const char Quote = '"'; private const string DoubleQuote = "\"\""; // 导出数据到CSV文件 public void ExportToCsv(string filePath, List<string[]> data) { using (var writer = new StreamWriter(filePath)) { foreach (var row in data) { var escapedRow = new List<string>(); foreach (var field in row) { // 对每个字段进行转义 escapedRow.Add(EscapeField(field)); } // 将行写入文件 writer.WriteLine(string.Join(Delimiter.ToString(), escapedRow)); } } } // 导入CSV文件数据 public List<string[]> ImportFromCsv(string filePath) { var data = new List<string[]>(); using (var reader = new StreamReader(filePath)) { string line; StringBuilder currentLine = new StringBuilder(); bool insideQuote = false; // 按行读取文件 while ((line = reader.ReadLine()) != null) { currentLine.Append(line); // 如果当前行中的引用字符数目为奇数,说明字段还未结束 if (line.Count(c => c == Quote) % 2 != 0) { // 字段未结束,继续读取下一行 currentLine.Append("\n"); continue; } // 解析完整行 var fields = ParseCsvLine(currentLine.ToString()); data.Add(fields); currentLine.Clear(); } // 添加剩余未处理的行 if (currentLine.Length > 0) { data.Add(ParseCsvLine(currentLine.ToString())); } } return data; } // 解析CSV行并处理特殊字符 private string[] ParseCsvLine(string csvLine) { var fields = new List<string>(); var buffer = new StringBuilder(); bool insideQuote = false; for (int i = 0; i < csvLine.Length; i++) { char currentChar = csvLine[i]; if (currentChar == Delimiter && !insideQuote) { // 如果未在引用内,则这是一个字段的分界 fields.Add(UnescapeField(buffer.ToString())); buffer.Clear(); } else if (currentChar == Quote) { if (insideQuote && i + 1 < csvLine.Length && csvLine[i + 1] == Quote) { // 处理转义的引号 buffer.Append(currentChar); i++; // 跳过下一个引号 } else { insideQuote = !insideQuote; } } else { // 添加字符到缓冲区 buffer.Append(currentChar); } } // 添加最后一个字段 fields.Add(UnescapeField(buffer.ToString())); return fields.ToArray(); } // 处理字段中的特殊字符 private string EscapeField(string field) { if (field.Contains(Delimiter) || field.Contains(Quote.ToString()) || field.Contains("\n")) { // 如果字段包含分隔符、引号或换行符,则需要进行转义 return Quote + field.Replace(Quote.ToString(), DoubleQuote) + Quote; } return field; } // 解除转义字段 private string UnescapeField(string field) { // 去除首尾的引号并处理双引号 if (field.StartsWith(Quote.ToString()) && field.EndsWith(Quote.ToString())) { field = field.Substring(1, field.Length - 2).Replace(DoubleQuote, Quote.ToString()); } return field; } } }

使用示例

下面是如何使用CsvHelper类来导入和导出包含特殊字符的CSV数据。

导出数据示例

C#
private void btnExport_Click(object sender, EventArgs e) { var data = new List<string[]> { new[] { "ID", "Name", "Description" }, new[] { "1", "Alice", "Software, Developer" }, new[] { "2", "Bob", "\"The best\" Coder" }, new[] { "3", "Charlie", "Line\nBreak" } }; var csvHelper = new CsvHelper(); csvHelper.ExportToCsv("output.csv", data); }

导入数据示例

C#
private void btnImport_Click(object sender, EventArgs e) { var csvHelper = new CsvHelper(); var importedData = csvHelper.ImportFromCsv("output.csv"); foreach (var row in importedData) { txt.AppendText(string.Join(", ", row)); txt.AppendText(System.Environment.NewLine); } }

image.png

结论

通过CsvHelper类,我们可以轻松导入和导出CSV文件,同时正确处理数据中的特殊字符。无论是文件中的引号、逗号,还是换行符,该类都有能力正确地处理。当您需要在C#项目中处理CSV时,CsvHelper是一个通用且可靠的选择。希望这篇文章能够帮助您更好地理解和实现CSV文件的操作。

本文作者:rick

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!