循环保持变量中的数据

时间:2019-04-10 15:08:44

标签: c#

我的代码遇到的问题是,它打开文件夹中的一个文件并读取第一行,如果它是标头(HDR),则它将该行分配给currentHDR变量,然后它将进行搜索对于文件上的错误,它忽略了两个已知的常见错误,如果存在错误,则应将currentHDR行和该行写入报告文件,然后将currnetHDR分配给当前变量。这是为了确保在检查同一文件的下一个内容时,在不写入标题行的情况下写入所有其他错误。完成并打开新文件后,仍应为“ current”分配一些内容,这就是为什么它检查current是否不为null,如果为null则将current为null。并继续循环。

这是代码:

private string folderPath;
private object file;
public string current { get; private set; }
public string currentHDR { get; private set; }

public void Main()
{
  folderPath = "C:\\data\\";

  foreach (string pathToFile in Directory.EnumerateFiles(folderPath, "*.BER"))
  {
    using (System.IO.StreamWriter file =
         new System.IO.StreamWriter(@"c:\data\newreport.txt", true))
    {
      foreach (var line in File.ReadLines(pathToFile))
      {
        if (line.Contains("HDR") && current == null)
        {
          string currentHDR = line;
        }
        else if (line.Contains("HDR") && current != null)
        {
          string currentHDR = line;
          current = "";
        }

        if (line.Contains("ERR~") && line.Contains("Warnings exist"))
        { }
        else
        {
          if (line.Contains("ERR~") && line.Contains("DEPARTPORT"))
          { }
          else
          {
            if (line.Contains("ERR~WARNING") && current == null)
            {
              file.WriteLine(currentHDR);
              file.WriteLine(line);
              current = currentHDR;
            }
            else if (line.Contains("ERR~WARNING") && current != null)
            {
              file.WriteLine(line);
            }
          }
        }
      }
    }
  } 
}

当前结果文件如下:

  

ERR〜WARNING-SHP.TPTID(xxx)的SHP.TPTCTRY()不能为空;

     

ERR〜WARNING-SHP.TPTID(xxx)的SHP.TPTCTRY()不能为空;

清楚地表明currentHDR在尝试将该行写出到文件时为空。就我所见,在循环中似乎并没有继续将值保留在变量中。

我误解了这是怎么回事?

1 个答案:

答案 0 :(得分:3)

问题在于以下几行:

if (line.Contains("HDR") && current == null)
{
   string currentHDR = line;
}
else if (line.Contains("HDR") && current != null)
{
   string currentHDR = line;
   current = "";
}

请注意,您正在使用string currentHDR = ...,这意味着您要声明一个范围为每个currentHDR块的不同的if变量。删除string类型声明,然后,您将使用期望的currentHDR字段:

if (line.Contains("HDR") && current == null)
{
   currentHDR = line;
}
else if (line.Contains("HDR") && current != null)
{
   currentHDR = line;
   current = "";
}