You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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环境的CsvHelper NuGet包
  • 若CSV无表头,将HasHeaderRecord设为false
  • 操作前务必备份原文件,避免数据丢失
  • 若转换后出现乱码,检查目标编码是否匹配系统默认ANSI编码

内容的提问来源于stack exchange,提问作者sara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 13:38:27