C#中UTF-8编码CSV转ANSI编码失败,求技术解决
问题分析与修复方案
核心问题1:输入输出文件路径重复
你的代码中输入和输出文件使用了同一路径,这会直接触发文件占用异常——StreamReader仍在读取文件时,StreamWriter尝试写入同一个文件,系统会提示文件正在被使用。
核心问题2:延迟执行引发的读取异常
csvReader.GetRecords<dynamic>()属于延迟执行逻辑,即便reader的using块包裹了writer的using块,写入过程中也可能因流状态异常导致读取失败。建议先把所有记录加载到内存后再执行写入操作。
编码匹配问题
你当前使用的Encoding.GetEncoding(1252)是西欧地区的ANSI编码(Windows-1252),如果是中文系统,通常所说的ANSI指GBK/GB2312(编码值936),若文件包含中文,用1252编码会导致乱码。
修复后的完整代码
static void Main() { Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); // 必须区分输入输出文件路径 string inputFile = @"C:\20250201_utf8.csv"; string outputFile = @"C:\20250201_ansi.csv"; // 先加载所有记录到内存,避免延迟执行问题 List<dynamic> records; using (var reader = new StreamReader(inputFile, Encoding.UTF8)) using (var csvReader = new CsvReader(reader, new CsvConfiguration(CultureInfo.InvariantCulture) { HasHeaderRecord = true // 根据你的CSV是否有表头调整该配置 })) { records = csvReader.GetRecords<dynamic>().ToList(); } // 选择目标ANSI编码:中文系统用936(GBK),西欧用1252 var targetEncoding = Encoding.GetEncoding(936); // var targetEncoding = Encoding.GetEncoding(1252); // 按需切换 using (var writer = new StreamWriter(outputFile, false, targetEncoding)) using (var csvWriter = new CsvWriter(writer, new CsvConfiguration(CultureInfo.InvariantCulture) { HasHeaderRecord = true // 保持和读取配置一致,确保表头正常写入 })) { // 写入表头(如果CSV有表头的话) csvWriter.WriteHeader(csvReader.Context.HeaderRecord); csvWriter.NextRecord(); csvWriter.WriteRecords(records); } Console.WriteLine("转换完成:UTF-8 转 ANSI"); }
额外注意事项
- 确认已安装适配当前.NET环境的
CsvHelperNuGet包 - 若CSV无表头,将
HasHeaderRecord设为false - 操作前务必备份原文件,避免数据丢失
- 若转换后出现乱码,检查目标编码是否匹配系统默认ANSI编码
内容的提问来源于stack exchange,提问作者sara
相关产品推荐
相关产品推荐

