从现有文件创建新文件

时间:2016-02-15 21:40:36

标签: c#

当我使用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;
                            }
                        }
                    }
                }

            }

2 个答案:

答案 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);
    }
}