2016-04-30 225 views
-2

我在文本文件上运行StreamReader并将数据存储到ArrayList中。数据以“,”分隔,并存储约会日期和时间。有些患者只看过两次,所以我不得不在文本文件中添加任何数据,但仍然添加“,”以确保StreamReader移过来。StreamReader从文本文件中读取

但是,当它到达只有两次访问的Patient时,它将停止读取文件并将数据存储到该点。我有一个try/catch错误处理,它告诉我什么时候停止读取文件。

例如;

1, Name,DOB,12/12/2015,13/12/2015,,,, 
2, Name,DOB,11/11/2015,,,, 

它读取了全部5次访问的所有患者,但是在“”之间没有数据的患者停止阅读。

我的阅读代码如下;

public static void LoadPatient(string filename) 
{ 
    try 
    { 
     StreamReader file = new StreamReader(filename); //System IO for StreamReader 
     while (!file.EndOfStream) 
     { 
      string line = file.ReadLine(); 
      string[] fields = line.Split(",".ToCharArray()); 
      int PID = int.Parse(fields[0]); 
      string pName = fields[1]; 
      string NIN = fields[2]; 
      DateTime pDOB = DateTime.Parse(fields[3]); 
      string pGender = fields[4]; 
      DateTime Visit1 = DateTime.Parse(fields[5]); 
      int Duration1 = int.Parse(fields[6]); 

      DateTime Visit2 = DateTime.Parse(fields[7]); 
      int Duration2 = int.Parse(fields[8]); 
      DateTime Visit3 = DateTime.Parse(fields[9]); 
      int Duration3 = int.Parse(fields[10]); 
      DateTime Visit4 = DateTime.Parse(fields[11]); 
      int Duration4 = int.Parse(fields[12]); 
      DateTime Visit5 = DateTime.Parse(fields[13]); 
      int Duration5 = int.Parse(fields[14]); 
      Patient p = new Patient(); 

      p.ID = PID; 
      p.Name = pName; 
      p.DOB = pDOB; 
      p.Gender = pGender; 
      p.NIN = NIN; 
      p.Visit1 = Visit1; 
      p.Duration1 = Duration1; 
      p.Visit2 = Visit2; 
      p.Duration2 = Duration2; 
      p.Visit3 = Visit3; 
      p.Duration3 = Duration3; 
      p.Visit4 = Visit4; 
      p.Duration4 = Duration4; 
      p.Visit5 = Visit5; 
      p.Duration5 = Duration5; 
      patientList.Add(p); 

     } 
     file.Close(); 
    } 
    catch (Exception) 
    { 
     MessageBox.Show("Error loading Data file"); 
    } 
} 
+0

大概之间没什么的“”可以被解析既不是整数,也没有日期时间 –

+0

你会建议不转换他们,直到他们被读入ArrayList中 – Griff

+0

别后如果它们为空,则将它们转换为 –

回答

0

我不会说它完全是“停止”,它是抛出异常。你有一个简单的情况,不检查你的索引。您需要确保所有索引都存在值,并且可以将该值解析为所需的数据类型。您可以在阵列上使用ElementAtOrDefault()来获取null而不是索引超出范围的异常。您可以使用TryParse进行转换而不会抛出无效的转换异常。

替换为您while循环:

while (!file.EndOfStream) 
    { 
     string line = file.ReadLine(); 
     string[] fields = line.Split(",".ToCharArray()); 

     Patient p = new Patient(); 

     int id = 0; 
     DateTime dob = DateTime.MinValue; 
     DateTime visit1 = DateTime.MinValue; 
     int duration1 = 0; 
     //... etc. for each visit 2, 3, 4 and 5 

     int.TryParse(fields.ElementAtOrDefault(0), out id); 
     p.Name = fields.ElementAtOrDefault(1); 
     p.NIN = fields.ElementAtOrDefault(2); 
     DateTime.TryParse(fields.ElementAtOrDefault(3), out dob);    
     p.Gender = fields.ElementAtOrDefault(4); 
     DateTime.TryParse(fields.ElementAtOrDefault(5), out visit1); 
     int.TryParse(fields.ElementAtOrDefault(6), out duration1); 

     //... etc. for each visit 2, 3, 4 and 5 

     p.ID = id; 
     p.DOB = dob; 
     p.Visit1 = visit1; 
     p.Duration1 = duration1; 
     //... etc. for each visit 2, 3, 4 and 5 

     patientList.Add(p); 
    } 
+0

非常感谢您的答复..我会反馈时我回家试试 – Griff

+0

我输入了您提供的代码,但是我在每行的末尾有一些错误...声明“属性或索引器不能用作输出或参考参数” – Griff

+0

我应该注意到那。您将需要创建中间变量,而不是直接分配给您的Patient属性。 – Crowcoder