如何在.net中按顺序处理文本文件时检查另一列值
本文关键字:检查 一列 文件 net 文本 顺序处理 | 更新日期: 2023-09-27 18:20:04
我正在阅读一个文本文件,其中包含10万个条目,很少有问题发布。我必须只读取那些活动的"Y"记录,其余的都是我必须跳过的,如果ASC
的列值是ASC10
或ASC20
,那么我必须将名为"sss"的字符串变量值设置为"Flori",如果ASC30
,那么我就必须检查另一个名为"SAC"的列,如果它的值是3,那么sss="Texi",否则如果它是4,那么sss="Flori)。
以下代码将读取文本文件并进行处理,但这两个要求我无法实现,因为值在同一行,并且按顺序检索值
我写的代码是:
private static void Readfiles()
{
string path = @"D:'study'Students.txt";
string sss = string.Empty;
System.Collections.ArrayList ar = new System.Collections.ArrayList();
string[] lines = File.ReadAllLines(path).Where(arg => !string.IsNullOrWhiteSpace(arg)).ToArray();
string[] cols = lines[0]
.Trim()
.Split(new[] { ''t', ' ' }, StringSplitOptions.RemoveEmptyEntries);
int liness = 1;
foreach (string line in lines.Skip(1))
{
string[] cells = line
.Trim()
.Split(new[] { ''t' }, StringSplitOptions.RemoveEmptyEntries);
for (int counter = 0; counter < cols.Length; counter++)
{
string cellValue = "N/A";
if (counter < cells.Length)
cellValue = cells[counter];
Console.WriteLine("{0} {1}", cols[counter],cellValue);
if (cols[counter] == "ASC")
{
if (cellValue == "ASC10" || cellValue == "ASC20")
{
sss = "Flori";
}
//Here i have to check other column named "SAC" but HOWWWWWWWWWWWWWW??????????????????????????????????/ because processing is sequential
if (cellValue == "ASC30")
{
sss = "Texi";
}
}
}
liness++;
}
}
文本文件格式为
Firstname lastname ASC age salary location active SAC
Tom jerry ASC10 32 20000 NY Y 3
Sam peter ASC20 31 30000 KY N 4
jason sam ASC30 21 40000 JU Y 3
jerry Forman ASC20 34 23456 KK Y 4
要跳过非活动行,请获取"活动"列的索引,并在foreach循环开始时检查该值:
int indexActive = Array.indexOf(cols, "active");
if (indexActive >= 0 && indexActive < cells.Count() && cells[indexActive] == "N")
{
continue; // this skips this round of the foreach loop and continues with the next one
}
获取SAC列的索引,并检查当前行中具有该索引的单元格,如下所示(插入注释处):
int indexSAC = Array.indexOf(cols, "SAC");
if (indexSAC >= 0 && indexSAC < cells.Count())
{
if (cells[indexSAC] == "3")
{
sss = "Texi";
}
else if (cells[indexSAC] == "4")
{
sss = "Flori";
}
}
第一行也可以在定义cols
数组后插入,这样只需执行一次。