[英]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.