当我使用streamreader打开它时,我有一个看起来像这样的文本文件:(“删除”只是为了告诉你我想做什么)
A, 1, 2, 3, 4, 5 B, 1, 2, 2, 2, 2 B, 1, 1, 1, 1, 1 A, 2, 2, 3, 4, 5 -- Remove A, 1, 2, 3, 4, 5 A, 2, 2, 3, 4, 5 -- Remove B, 1, 2, 2, 2, 2 -- Remove B, 1, 1, 1, 1, 1 -- Remove A, 1, 2, 3, 4, 5 B, 1, 2, 2, 2, 2
“A”是父行,“B”是父行正下方的子行。有些A可能没有子行。基本上,我想要一个只有A和他们的孩子(B's)的新文本文件,其中A行中的第二个字段不包含2.所以我的新文本文件(使用streamwriter)看起来像:
A, 1, 2, 3, 4, 5 B, 1, 2, 2, 2, 2 B, 1, 1, 1, 1, 1 A, 1, 2, 3, 4, 5 A, 1, 2, 3, 4, 5 B, 1, 2, 2, 2, 2
我可以得到A行,没有“2”,但是很难得到它下面的儿童线......
帮助任何人?
我认为我的工作正常,但并不优雅:
List<string> str = new List<string>();
while (!file.EndOfStream)
{
var line = file.ReadLine();
str.Add(line);
}
file.Close();
using (var sw = new StreamWriter(file))
{
for(int i = 0; i <= str.Count-1; i++)
{
var values = str[i].Split(',');
if (values[0] == "A" && values[1] != "2")
{
sw.WriteLine(str[i]);
int j = i+1;
for (int e = j; e <= str.Count - 1; e++)
{
var values2 = str[e].Split(',');
if (values2[0] == "B")
{
sw.WriteLine(str[e]);
}else if(values2[0] == "A")
{
break;
}
}
}
}
}
答案 0 :(得分:2)
我可能会做这样的事情。请注意,这假定文件始终与您的示例相似,并且不进行错误检查:
using (StreamReader reader = new StreamReader(inputFile))
using (StreamWriter writer = new StreamWriter(outputFile))
{
bool delete = false;
while (!reader.EndOfStream)
{
string line = reader.ReadLine();
string[] lineItems = line.Split(',');
if (lineItems[0].Trim() == "A")
delete = lineItems[1].Trim() == "2";
if (!delete)
writer.WriteLine(line);
}
}
答案 1 :(得分:0)
由于你已经从当前A
知道你将删除它以及跟随它的任何B,你可以简单地将状态保留在布尔值中。
static void ProcessStream(TextReader input, TextWriter output)
{
bool remove = false;
string line;
while ((line = input.ReadLine()) != null)
{
var parts = line.Split(',');
//for A, decide to remove this and next lines
if (parts[0] == "A")
remove = parts[1].Contains("2");
if (!remove)
output.WriteLine(line);
}
}