2014-02-27 83 views
0

我正在尝试读取文本文件的某个部分。文本如下所示:尝试读取txt文件 - 锁定

[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,数据看起来不错。

+1

在将其中一个与'[HRData]'进行比较之前,您正在一次读取两行...您需要摆脱循环内的'line = sr.ReadLine();'所以您只能阅读一次一行。 – dreamlax

+0

我编辑了你的标题。请参阅:“[应该在其标题中包含”标签“](http://meta.stackexchange.com/questions/19190/)”,其中的共识是“不,他们不应该”。 –

回答

2

这里您检查一行并跳过下一个其中之一。避免第二个ReadLine

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

有了这个循环,你的风险跳过去的包含您的搜索文本,因为你读一个线上的两个时间,但只测试一次

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

如果文件恰好行多了一个线之前的循环可能它会工作,但错误依然存在,我注意到

+0

非常感谢 - 只要它让我:)将接受:) – Remotejon

0

两件事:

1)你有没有检查[HRData]“标签”。您检查不是标记的行,而不是空值。

2)我认为你while循环作为一个整体不知道在文件结束时停止阅读。

1

检查EOF和修剪()它使文本相等性工作。下面应该工作

  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++; 
        } 
       } 
      } 
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]")) { 
    // ... 
}