首页 > 解决方案 > 在转换 TXT 文件(C# 或任何其他语言)时处理空记录

问题描述

我一直在尝试解决这个问题很长时间,但我无法解决它。

我需要转换一个 txt 文件,我想用逗号替换空格,但是在某些情况下存在空记录。

我的 TXT 文件如下所示:

POL-45345334234       -963747       -963747 $   KAN  98   HU 554534     2179007             2021 20210127 20210127       -963747              
POL-99345552342        628308        423818 $   KAN  98   JU 999898     1402048             2021 20190104 20190208        423818   30        0

如果您看一下,TXT 文件有 15 列,但有些记录并没有填满所有列,只是其中的一些列。

我想获得这样的东西:

POL-45345334234,-963747,-963747,$,KAN,98,HU,554534,2179007,2021,20210127,20210127,-963747,,              
POL-99345552342,628308,423818,$,KAN,98,JU,999898,1402048,2021,20190104,20190208,423818,30,0

仔细看看这个:

,, 

一个人建议我使用这样的东西:

System.Text.RegularExpressions;

       using (StreamWriter sw = new StreamWriter(@"D:\output.csv"))
        {
            using (var fs = new FileStream(filename, FileMode.Open, FileAccess.Read))
            {
                using (var sr = new StreamReader(fs, Encoding.UTF8))
                {
                    string line = String.Empty;
                    while ((line = sr.ReadLine()) != null)
                    {
                        string newline = Regex.Replace(line, @"\s+", ",");
                        sw.WriteLine(newline);
                    }
                }
            }
        }

问题是这样做我没有考虑空记录,它并不是真的有用。

我该如何处理这种情况?有什么想法吗?

标签: c#

解决方案


在我看来,线条是固定宽度的,并且列的起始位置都对齐。因此,如果您为与每列对应的每一行获取子字符串,则可以单独修剪每列的空格。

您可以将 Regex 行替换为

string newline = ParseLine(line);

并引入这样的解析函数

string ParseLine(string line)
{
    string separator = ",";
    int[] starts = new int[] { 0, 22, 36, 43, 47, 53, 57, 60, 71, 91, 96, 105, 121, 130, 140, 142 };
    List<string> row = new List<string>();
    for (int i = 0; i < starts.Length - 1; i++)
    {
        row.Add(line.Substring(starts[i], starts[i + 1] - starts[i]).Trim());
    }
    return String.Join(separator, row);
}

该功能可以更精细,并自动调整到不同的间距,但希望它是一个开始。


推荐阅读