繁体   English   中英

读取文本文件C#

[英]Reading Text file C#

我有以下文本内容(保存为.txt文件)

  Region2    Region3     Region4   Region5   Region6 
Mod Fwd   Dir     TOP SYS  SECURITY    ZONING      BOTTOM    FCC DIS   FCC ENA 
    Eng          Use/Total Use/Total  Use/Total   Use/Total Use/Total Use/Total
--- ---  ------ ---------- --------- ------------ --------- --------- ---------
1   1    INPUT     20/407     1/407      0/2852      8/407     0/0       0/0   
1   1    OUTPUT     0/25      0/25       0/140       0/25      0/12      1/25  
1   2    INPUT     20/407     1/407      0/2852      8/407     0/0       0/0   
1   2    OUTPUT     0/25      0/25       0/140       0/25      0/12      1/25  
1   3    INPUT     20/407     1/407      0/2852      4/407     0/0       0/0   
1   3    OUTPUT     0/25      0/25       0/140       0/25      0/12      1/25

我需要获取的只是分区详细信息,并将其放在另一个文本文件中,因此最终结果应如下所示

Region3 - Zoning
Use/Total
0/2852
0/140
0/2852
0/140
0/2852
0/140

我正在努力正确地阅读格式,将不胜感激。

要从文件读取所有行,请使用File.ReadAllLines

如果格式始终相同,我将使用Linq扩展Skip()跳过标头。 然后,使用此String.Split()覆盖在空间上拆分字段,从而过滤掉空字符串。

喜欢:

        foreach (var line in File.ReadLines("yourfile.txt").Skip(4))
        {
            var fields = line.Split(new[] {" "}, StringSplitOptions.RemoveEmptyEntries);
            //do something with the fields
        }

或者,如果使用制表符分隔符,则可以使用: line.Split('\\ t');

然后,您从fields数组中检索所需的字段 ,因此对于第6个字段:

var myField = fields[5]

您可以将要写入的所有行都放入字符串数组(或列表),然后使用File.WriteAllLines编写所有内容

File.WriteAllLines("output.txt", myOutputLines);

完整的解决方案

这是一个可能的解决方案,它使用LINQ和IEnumerables将所有内容组合在一起,以简化文件转换,而无需将所有内容加载到内存中(以允许有效地处理大型文件)

var inputLines = File.ReadLines("yourfile.txt").Skip(4);
var outputHeader = new[] { "Region3 - Zoning", "Use/Total" };
var outputLines = inputLines.Select(line => line.Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries)[5]);
File.WriteAllLines("output.txt", outputHeader.Concat(outputLines));

好的,新的一天和崭新的想法,感谢您的所有评论。 这就是我解决问题的方式(这里的问题是,如果分区列移动到其他位置,它将予以考虑)

这是代码

int headerCount = 1;
        int zoneNumber = 0;
        string[] lines = File.ReadAllLines(@"C:\temp\tcam\test.txt");
        foreach (string line in lines)
        {
            headerCount++;
            if (headerCount == 6)
            {
                string[] zonelocation = line.Split(new char[0], StringSplitOptions.RemoveEmptyEntries);
                int zoneCount = 0;
                string lastVal = "";
                foreach (var x in zonelocation)
                {
                    zoneCount++;
                    if (lastVal.ToLower() == "top" && x.ToLower() == "sys") zoneCount--;
                    if (x.ToLower() == "zoning") zoneNumber = zoneCount - 1;
                    lastVal = x;
                }
            }
            if (headerCount > 8)
            {
                string[] zoneinfo = line.Split(new char[0], StringSplitOptions.RemoveEmptyEntries);
                if (zoneinfo.Any())
                {
                    string[] zoneData = zoneinfo[zoneNumber].Split(new char[] {'/'}, StringSplitOptions.RemoveEmptyEntries);
                    Console.WriteLine($"Fwd Eng {zoneinfo[1]}, Direction {zoneinfo[2]}, Used {zoneData[0]}, Total {zoneData[1]}");
                }
            }
        }

这是输出

Fwd Eng 1,方向输入,使用0,总计2852

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM