StreamReader从文本文件中读取

时间:2016-04-30 23:03:14

标签: c# streamreader

我在文本文件上运行StreamReader并将数据存储到ArrayList。数据以“,”分隔,并存储约会日期和时间。有些患者只被看过两次,所以我不得在文本文件中添加任何数据,但仍然添加“,”以确保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");
    }
}

1 个答案:

答案 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);
    }