试图读取txt文件 - 锁定

时间:2014-02-27 21:05:16

标签: c# split streamreader readline

我正在尝试阅读文本文件的某个部分。该文字如下所示:

[HRZones]
195
175
156

0

[SwapTimes]

[Trip]
474
0
6616
-223


[HRData]
84  182 87  -222    129 4139
84  182 87  -222    129 4139
88  179 86  -222    133 3640
95  185 92  -222    136 3393
103 193 91  -222    123 4666
107 196 94  -222    125 5684
107 198 96  -222    128 4919
109 197 95  -222    131 4926
110 198 96  -222    134 4655
111 196 95  -222    126 4154

该文件实际上在[HRData]部分下包含更多行。

我正在尝试使用以下代码获取[HRData}。可悲的是,这锁定了程序;断点显示这发生在第一个while循环中..几乎就像它看不到任何东西?

 private void readFile()
    {
        //read the hrm file and split values
        try
        {
            using (StreamReader sr = new StreamReader(file_name))
            {
                string line;

                while ((line = sr.ReadLine()) != "[HRData]")
                {
                    line = sr.ReadLine(); // FAILS HERE.. 
                }

                while((line = sr.ReadLine()) != null)
                {
                    string split = line;
                    string[] values = split.Split('\t');
                    foreach (String value in values)
                    {
                        hrdata[i, j] = int.Parse(value);
                        i++;
                        if (i > 5)
                        {
                            i = 0;
                            j++;
                        }
                    }
                }
            }
        }

正在从先前的检查传递file_name,数据似乎很好。

5 个答案:

答案 0 :(得分:2)

在这里,您检查一行并跳过下一个。避免第二次ReadLine

while ((line = sr.ReadLine()) != "[HRData]")
{
    line = sr.ReadLine(); // FAILS HERE.. 
}

答案 1 :(得分:1)

检查EOF和Trim()它以使文本相等起作用。以下应该工作

            while (!sr.EndOfStream)
            {
                var line = sr.ReadLine();
                if (!string.IsNullOrWhiteSpace(line) && line.Trim() == "[HRData]")
                {
                    break;
                }
            }

            while (!sr.EndOfStream)
            {
                string split = sr.ReadLine();
                string[] values = split.Split('\t');

                foreach (String value in values)
                {
                    hrdata[i, j] = int.Parse(value);
                    i++;
                    if (i > 5)
                    {
                        i = 0;
                        j++;
                    }
                }
            }

答案 2 :(得分:1)

正如一些人已经指出的那样,你在循环条件下读取一条线,然后又在循环体中读取一条线,这样这可能会起作用或失败,这取决于[HRData]是出现在奇数还是偶数上文件的行。

while循环重写为for,而不是:

for (var line = sr.ReadLine();
     line != null && line != "[HRData]");
     line = sr.ReadLine()) { /* NOP */ }

如果你有能力使用LINQ,那么以下更简单,不需要任何脑力体操:

foreach (var line in File.ReadLines().SkipWhile(s => s != "[HRData]")) {
    // ...
}

答案 3 :(得分:0)

使用该循环,您可能会跳过包含搜索文本的行,因为您读了两行但只测试了一次

 string line = sr.ReadLine();
 while (line != null && line != "[HRData]")
 {
     line = sr.ReadLine();
 }

如果文件恰好在循环之前有一行,那么它可能会有效,但错误仍然存​​在

答案 4 :(得分:0)

我注意到的两件事:

1)您有检查[HRData]“代码”。检查不是标记的行而不是null。

2)我认为你的循环作为一个整体不知道在文件的末尾停止阅读。