C# 将数据从文件读入类对象数组

C# 将数据从文件读入类对象数组,c#,arrays,file-io,split,C#,Arrays,File Io,Split,我正在从一个文件中读取数据,该文件需要放入我的对象数组(myEmployees)。在本例结束之前,我相信我的代码是正确的,但我不确定如何从文件中读取数据,将其拆分,然后将其正确地放入类对象数组中 //declare an array of employees Employee[] myEmployees = new Employee[10]; //declare other variables string inputLine; string EmpName; int EmpNum; doub

我正在从一个文件中读取数据,该文件需要放入我的对象数组(myEmployees)。在本例结束之前,我相信我的代码是正确的,但我不确定如何从文件中读取数据,将其拆分,然后将其正确地放入类对象数组中

//declare an array of employees
Employee[] myEmployees = new Employee[10];

//declare other variables
string inputLine;
string EmpName;
int EmpNum;
double EmpWage;
double EmpHours;
string EmpAdd;

//declare filepath
string environment = System.Environment.GetFolderPath
(System.Environment.SpecialFolder.Personal) + "\\";

//get input
Console.Write("\nEnter a file name in My Documents: ");
string input = Console.ReadLine();
string path = environment + input;
Console.WriteLine("Opening the file...");

//read file
StreamReader myFile = new StreamReader(path);
inputLine = (myFile.ReadLine());
因此,我从一个文件中读取数据,该文件的结构如下:

Employee Number
Employee Name
Employee Address
Employee wage Employee Hours
我需要从这个文件中读取数据,并将其解析到我创建的员工数组中。以下是班级员工的班级数据:

public void Employeeconst ()
{
    employeeNum = 0;
    name = "";
    address = "";
    wage = 0.0;
    hours = 0.0;
}
public void SetEmployeeNum(int a)
{
    employeeNum = a;
}
public void SetName(string a)
{
    name = a;
}
public void SetAddress(string a)
{
    address = a;
}
public void SetWage(double a)
{
    wage = a;
}
public void SetHours(double a)
{
    hours = a;
}
public int GetEmployeeNum()
{
    return employeeNum;
}
public string GetName()
{
    return name;
}
public string GetAddress()
{
    return address;
}
public double GetWage()
{
    return wage;
}
public double GetHours()
{
    return hours;
}

我建议逐行读

请参见MSDN上的示例

对于您阅读的每一行,您将有一个字符串-您可以使用string.split将该字符串拆分为一个数组

string mystring = "50305 FirstName LastName 1234 Anywhere Place 133.25 40";
string[] myarray = mystring.Split(' ');
不过,我建议处理doublespaces等的字符串输入

您可以这样做来消除重复的空格

string mynewstring = mystring.Replace("  ", " ");

while (mynewstring.Contains("  "))
{
  mynewstring = mystring.Replace("  ", " ");
}

我建议逐行读

请参见MSDN上的示例

对于您阅读的每一行,您将有一个字符串-您可以使用string.split将该字符串拆分为一个数组

string mystring = "50305 FirstName LastName 1234 Anywhere Place 133.25 40";
string[] myarray = mystring.Split(' ');
不过,我建议处理doublespaces等的字符串输入

您可以这样做来消除重复的空格

string mynewstring = mystring.Replace("  ", " ");

while (mynewstring.Contains("  "))
{
  mynewstring = mystring.Replace("  ", " ");
}

首先,我建议使用属性重新设计Employee类,属性更具可读性,更好地遵循面向对象编程的原则:

public class Employee
{
    public int EmployeeNum { get; set; }
    public string Name { get; set; }
    public string Address { get; set; }
    public double Wage { get; set; }
    public double Hours { get; set; }

    public void Employee()
    {
        EmployeeNum = 0;
        Name = "";
        Address = "";
        Wage = 0.0;
        Hours = 0.0;
    }
}

还考虑在“使用”关键字中包装流读取器,确保文件将正确关闭。程序的其余部分很简单,只需逐行读取文件,直到文件结束。将每行解析为所需类型,并将值设置为Employee对象:

        using(StreamReader myFile = new StreamReader(path))
        {
            int index = 0;
            while(!myFile.EndOfStream)
            {
                Employee E = new Employee();
                E.EmployeeNum = Int32.Parse(myFile.ReadLine());
                E.Name = myFile.ReadLine();
                E.Address = myFile.ReadLine();
                E.Wage = Double.Parse(myFile.ReadLine());
                E.Hours = Double.Parse(myFile.ReadLine());
                myEmployees[index++] = E;
            }
        }

我的示例代码中没有包含eny错误检查,因此由您来执行。

首先,我建议您使用属性重新设计Employee类,属性更具可读性,更好地遵循面向对象编程的原则:

public class Employee
{
    public int EmployeeNum { get; set; }
    public string Name { get; set; }
    public string Address { get; set; }
    public double Wage { get; set; }
    public double Hours { get; set; }

    public void Employee()
    {
        EmployeeNum = 0;
        Name = "";
        Address = "";
        Wage = 0.0;
        Hours = 0.0;
    }
}

还考虑在“使用”关键字中包装流读取器,确保文件将正确关闭。程序的其余部分很简单,只需逐行读取文件,直到文件结束。将每行解析为所需类型,并将值设置为Employee对象:

        using(StreamReader myFile = new StreamReader(path))
        {
            int index = 0;
            while(!myFile.EndOfStream)
            {
                Employee E = new Employee();
                E.EmployeeNum = Int32.Parse(myFile.ReadLine());
                E.Name = myFile.ReadLine();
                E.Address = myFile.ReadLine();
                E.Wage = Double.Parse(myFile.ReadLine());
                E.Hours = Double.Parse(myFile.ReadLine());
                myEmployees[index++] = E;
            }
        }

我的示例代码中没有包含eny错误检查,因此由您来执行。

@Robert Harvey删除我的答案的原因是什么。请让我知道,这样我就不会重复这个错误。@Robert Harvey删除我的答案的原因是什么。请让我知道,这样我就不会重复错误。非常感谢,这是非常干净的代码!这是一个家庭作业,所以我实际上必须为每个get/set编写单独的方法,否则我会使用属性来完成。我真的很喜欢你读文件的方式。编辑:回答了我自己的问题,所以这段代码在“E.Wage”行抛出了一个异常,表示“输入字符串格式不正确”。由于您没有包含输入文件的示例,我无法判断问题出在哪里,但我猜您文件中的工资(可能还有小时数)使用了十进制分隔符,这与您的区域性中使用的小数分隔符不匹配。使用Parse方法的重载,该方法接受CultureInfo作为第二个参数,并提供相应的CultureInfo对象。类似E.Wage=Double.Parse(myFile.ReadLine(),System.Globalization.CultureInfo.GetCultureInfo(“某种适当的文化”);我刚刚使用了你提供的代码。在该文件中,“工资”使用十进制分隔符。谢谢你的帮助!非常感谢,这是非常干净的代码!这是一个家庭作业,所以我实际上必须为每个get/set编写单独的方法,否则我会使用属性来完成。我真的很喜欢你读文件的方式。编辑:回答了我自己的问题,所以这段代码在“E.Wage”行抛出了一个异常,表示“输入字符串格式不正确”。由于您没有包含输入文件的示例,我无法判断问题出在哪里,但我猜您文件中的工资(可能还有小时数)使用了十进制分隔符,这与您的区域性中使用的小数分隔符不匹配。使用Parse方法的重载,该方法接受CultureInfo作为第二个参数,并提供相应的CultureInfo对象。类似E.Wage=Double.Parse(myFile.ReadLine(),System.Globalization.CultureInfo.GetCultureInfo(“某种适当的文化”);我刚刚使用了你提供的代码。在该文件中,“工资”使用十进制分隔符。谢谢你的帮助!