如何在文本文件中读取超过2行? C#

时间:2017-04-13 10:35:57

标签: c#

我目前正在使用File.ReadLines将文本文件读入List<>。 为了识别我想要阅读的行,我已经识别了前一行,然后为了识别该行中的字符串,我使用了split string并将其输出到控制台。当我想读取超过2行时,我没有得到所需的输出,这是我的代码;

 List<string> _FileContents = File.ReadLines(path)ToList();

        string pLine = "";
        string previousTrack = "";
        string ppLine = "";

        foreach (string line in _FileContents)
        {
            if (pLine.Contains("Race"))
            {
                if (pLine.Contains("TOD")) { }
            }
            else
            {
                if (line.Contains("Def"))
                {
                    char delimiter = ' ';
                    string value = line;
                    string[] mySubstring = value.Split(delimiter);
                    string thisTrack = mySubstring[1];
                    string thisTrackName = mySubstring[5];
                    if (thisTrack != previousTrack)
                    {
                    Console.WriteLine(thisTrack);                            
                    }
                    previousTrack = mySubstring[1];
                }
            }
        }

这是我尝试阅读超过2行;

foreach (string line in _FileContents)
    {
        if (ppLine.Contains("Race"))
        {
            if (ppLine.Contains("TOD")) { }
        }
        else
        {
            if (pLine.Contains("Def"))
            {
                char delimiter = ' ';
                string value = line;
                string[] mySubstring = value.Split(delimiter);
                string thisTrack = mySubstring[1];
                string thisTrackName = mySubstring[5];
                if (thisTrack != previousTrack)
                {
                Console.WriteLine(thisTrack);                            
                }
                previousTrack = mySubstring[1];
                if(line.Contains("Spell")
                 { }
            }
        }
         ppLine =pLine;
         pLine = line;
    }

我的目的是在这里阅读3行,但仍然在第二行使用拆分字符串,即pLine。由于这些行在我正在阅读的文本文件中的方式,如果我一起阅读这3行,那么我将不会检索重复的数据。

00000347: CEH r4  (Race) Race: 4 Post:     MTP:   TOD:2118
00000368: PHD r8  (Def) Phil   8/ 1/2016
00000406: PHD r8  (Spell)

我用我的分裂字符串捕获的CEH。我想要文件中的所有3个字母缩写,并且这3行中的每个组都有此信息。这些缩写在许多其他行上,但没有组织。我的目标最终将是对List进行排序并将它们输出到winform中的comboBox。

我的输出读数为2行如下 DMD CEH PHD STD 2BD MTD FCM ELD PMM 路德 ADM HSM 秦 跨国公司 EMD ASD LQN VCD TQN GZN AJE 我想要的输出是关键词&#34; Spell&#34;从最后一行开始。

2 个答案:

答案 0 :(得分:2)

我建议使用for循环,这样你就可以一次移动三行:

var fileContents = File.ReadLines("some path").ToArray();
        for (int i = 0; i < fileContents.Length - 2; i++)
        {
            var line1 = fileContents[i+0];
            var line2 = fileContents[i+1];
            var line3 = fileContents[i+2];
        }

我的第二次尝试:

private static void Slider2()
    {
        var _FileContents = File.ReadAllLines("<path>");
        var previousLine = string.Empty;
        var lineBeforePrevious = string.Empty;
        foreach (var line in _FileContents)
        {
            // do something with line, previousLine and lineBeforePrevious

            // put some conditions around this
            lineBeforePrevious = previousLine;

            // put some conditions around this
            previousLine = line;
        }
    }

P.S。我不能发表评论

答案 1 :(得分:0)

虽然只需使用for(...)即可实现此任务,但您可以使用 ORegex 找到要处理的行:

        var input = File.ReadLines("myFile").ToArray();

        var pTable = new PredicateTable<Word>();
        pTable.AddPredicate("def", x => x.Contains("Def"));
        pTable.AddPredicate("race", x => x.Contains("Race")); 
        pTable.AddPredicate("raceTod", x => x.Contains("Race") && x.Contains("TOD")); 

        var matches = new ORegex<string>("(?<g1>{race}{def})|(?<g2>{raceTod})", pTable).Matches(input)
        foreach(var m in matches)
        {
           var lines = m.Values.ToArray()
           var first = m.OCaptures["g1"];
           var second = m.OCaptures["g2"];
           //process your lines/groups
        }

通过这种方式,您不仅可以获得这些行,还可以获得周围的上下文,例如:

{race}{def}.{1,3}

你可以在'Race'和'Def'之后获得1到3行。