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

如何使用C#实现固定列宽文本文件到CSV的正确分列转换

问题根因

你当前代码仅配置了按制表符\t、分号;拆分字段,但你提供的输入文本是通过多个连续空格分隔不同列,不存在制表符或分号,所以拆分逻辑失效,整行内容会被识别为单个字段存入CSV。同时你输出CSV时仍使用制表符作为分隔符,如果用Excel等工具打开时默认按逗号识别,也会出现整行在单个单元格的问题。

修复实现

我们调整拆分逻辑,支持按任意空白字符拆分并自动忽略连续空白产生的空值,同时输出符合标准的逗号分隔CSV,优化后的代码如下:

using System;
using System.IO;
using System.Text;

class Program
{
    static void Main()
    {
        string sourcefile = @"C:\Temp\NALabc.txt";
        string destfile = @"C:\Temp\NAL.csv";
        
        // 读取所有行,可根据实际文件编码调整Encoding参数
        string[] lines = File.ReadAllLines(sourcefile, Encoding.Default);
        // using语句自动释放文件流,无需手动Close
        using (StreamWriter csvfile = new StreamWriter(destfile, false, Encoding.Default))
        {
            foreach (string line in lines)
            {
                // 按任意空白字符拆分,自动移除空条目,适配多空格分隔的场景
                string[] cells = line.Split(new char[] {' ', '\t'}, StringSplitOptions.RemoveEmptyEntries);
                // 标准CSV用逗号分隔
                csvfile.WriteLine(string.Join(",", cells));
            }
        }
    }
}
固定列宽场景适配

如果你的输入文本是严格固定列宽的(比如第一列占10位、第二列占8位,不会因为内容长度变化列位置),可以用按位置截取的方式拆分,避免部分字段本身带空格导致拆分错误,示例拆分逻辑如下:

// 示例定义每列的长度,根据你的实际列宽调整数值
int[] columnWidths = new int[] { 10, 8, 8, 8, 8, 8, 8, 8, 8, 8 };
foreach (string line in lines)
{
    List<string> cells = new List<string>();
    int currentPosition = 0;
    foreach (int width in columnWidths)
    {
        if (currentPosition + width > line.Length) break;
        string cell = line.Substring(currentPosition, width).Trim();
        cells.Add(cell);
        currentPosition += width;
    }
    csvfile.WriteLine(string.Join(",", cells));
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 19:54:02