web-dev-qa-db-fra.com

Lecture d'un fichier texte à l'aide d'OpenFileDialog dans les formulaires Windows

Je suis novice dans la fonction OpenFileDialog, mais je connais les bases. Ce que je dois faire, c'est ouvrir un fichier texte, lire les données à partir du fichier (texte uniquement) et les placer correctement dans des zones de texte distinctes dans mon application. Voici ce que j'ai dans mon gestionnaire d'événement "open file":

private void openToolStripMenuItem_Click(object sender, EventArgs e)
{
    OpenFileDialog theDialog = new OpenFileDialog();
    theDialog.Title = "Open Text File";
    theDialog.Filter = "TXT files|*.txt";
    theDialog.InitialDirectory = @"C:\";
    if (theDialog.ShowDialog() == DialogResult.OK)
    {
        MessageBox.Show(theDialog.FileName.ToString());
    }
}

Le fichier texte que j'ai besoin de lire est le suivant (pour les devoirs, je dois lire ce fichier exact). Il comporte un numéro d'employé, son nom, son adresse, son salaire et les heures travaillées:

1
John Merryweather
123 West Main Street
5.00 30

Dans le fichier texte que j'ai reçu, il y a 4 autres employés avec des informations immédiatement après, dans le même format. Vous pouvez voir que le salaire et les heures des employés sont sur la même ligne, pas une faute de frappe.

J'ai une classe d'employés ici:

public class Employee
{
    //get and set properties for each 
    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 employeeConst() //constructor method
    {
        EmployeeNum = 0;
        Name = "";
        Address = "";
        Wage = 0.0;
        Hours = 0.0;
    }

    //Method prologue
    //calculates employee earnings
    //parameters: 2 doubles, hours and wages
    //returns: a double, the calculated salary
    public static double calcSalary(double h, double w)
    {
        int OT = 40;
        double timeandahalf = 1.5;
        double FED = .20;
        double STATE = .075;
        double OThours = 0;
        double OTwage = 0;
        double OTpay = 0;
        double gross = 0; ;
        double net = 0;
        double net1 = 0;
        double net2 = 0;
        if (h > OT)
        {
            OThours = h - OT;
            OTwage = w * timeandahalf;
            OTpay = OThours * OTwage;
            gross = w * h;
            net = gross + OTpay;
        }
        else
        {
            net = w * h;
        }

        net1 = net * FED; //the net after federal taxes
        net2 = net * STATE; // the net after state taxes

        net = net - (net1 + net2);
        return net; //total net
    }
}

Je dois donc extraire le texte de ce fichier dans ma classe Employé, puis exporter les données dans la zone de texte appropriée dans l'application Windows Forms. J'ai du mal à comprendre comment bien faire les choses. Dois-je utiliser un lecteur de flux? Ou y a-t-il une autre meilleure façon dans ce cas? Merci.

24
xavi

Voici un moyen:

Stream myStream = null;
OpenFileDialog theDialog = new OpenFileDialog();
theDialog.Title = "Open Text File";
theDialog.Filter = "TXT files|*.txt";
theDialog.InitialDirectory = @"C:\";
if (theDialog.ShowDialog() == DialogResult.OK)
{
    try
    {
        if ((myStream = theDialog.OpenFile()) != null)
        {
            using (myStream)
            {
                // Insert code to read the stream here.
            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message);
    }
}

Modifié à partir d'ici: MSDN OpenFileDialog.OpenFile

[~ # ~] edit [~ # ~] Voici une autre façon plus adaptée à vos besoins:

private void openToolStripMenuItem_Click(object sender, EventArgs e)
{
    OpenFileDialog theDialog = new OpenFileDialog();
    theDialog.Title = "Open Text File";
    theDialog.Filter = "TXT files|*.txt";
    theDialog.InitialDirectory = @"C:\";
    if (theDialog.ShowDialog() == DialogResult.OK)
    {
        string filename = theDialog.FileName;

        string[] filelines = File.ReadAllLines(filename);

        List<Employee> employeeList = new List<Employee>();
        int linesPerEmployee = 4;
        int currEmployeeLine = 0;
        //parse line by line into instance of employee class
        Employee employee = new Employee();
        for (int a = 0; a < filelines.Length; a++)
        {

            //check if to move to next employee
            if (a != 0 && a % linesPerEmployee == 0)
            {
                employeeList.Add(employee);
                employee = new Employee();
                currEmployeeLine = 1;
            }

            else
            {
                currEmployeeLine++;
            }
            switch (currEmployeeLine)
            {
                case 1:
                    employee.EmployeeNum = Convert.ToInt32(filelines[a].Trim());
                    break;
                case 2:
                    employee.Name = filelines[a].Trim();
                    break;
                case 3:
                    employee.Address = filelines[a].Trim();
                    break;
                case 4:
                    string[] splitLines = filelines[a].Split(' ');

                    employee.Wage = Convert.ToDouble(splitLines[0].Trim());
                    employee.Hours = Convert.ToDouble(splitLines[1].Trim());
                    break;


            }

        }
        //Test to see if it works
        foreach (Employee emp in employeeList)
        {
            MessageBox.Show(emp.EmployeeNum + Environment.NewLine +
                emp.Name + Environment.NewLine +
                emp.Address + Environment.NewLine +
                emp.Wage + Environment.NewLine +
                emp.Hours + Environment.NewLine);
        }
    }
}
35
jordanhill123

pour cette approche, vous devrez ajouter system.IO à vos références en ajoutant la ligne de code suivante, sous les autres références, vers le haut du fichier c # (où l'autre est utilisé avec ****. **).

using System.IO;

ce code suivant contient 2 méthodes de lecture du texte, la première lit les lignes simples et les stocke dans une variable chaîne, la seconde lit le texte en entier et l’enregistre dans une variable chaîne (y compris "\ n" (entre))

les deux devraient être assez faciles à comprendre et à utiliser.


    string pathToFile = "";//to save the location of the selected object
    private void openToolStripMenuItem_Click(object sender, EventArgs e)
    {
        OpenFileDialog theDialog = new OpenFileDialog();
        theDialog.Title = "Open Text File";
        theDialog.Filter = "TXT files|*.txt";
        theDialog.InitialDirectory = @"C:\";
        if (theDialog.ShowDialog() == DialogResult.OK)
        {
            MessageBox.Show(theDialog.FileName.ToString());
            pathToFile = theDialog.FileName;//doesn't need .tostring because .filename returns a string// saves the location of the selected object

        }

        if (File.Exists(pathToFile))// only executes if the file at pathtofile exists//you need to add the using System.IO reference at the top of te code to use this
        {
            //method1
            string firstLine = File.ReadAllLines(pathToFile).Skip(0).Take(1).First();//selects first line of the file
            string secondLine = File.ReadAllLines(pathToFile).Skip(1).Take(1).First();

            //method2
            string text = "";
            using(StreamReader sr =new StreamReader(pathToFile))
            {
                text = sr.ReadToEnd();//all text wil be saved in text enters are also saved
            }
        }
    }

Pour diviser le texte, vous pouvez utiliser .Split ("") et utiliser une boucle pour replacer le nom dans une chaîne. si vous ne voulez pas utiliser .Split (), vous pouvez également utiliser foreach et ad une instruction if pour le scinder si nécessaire.


pour ajouter les données à votre classe, vous pouvez utiliser le constructeur pour ajouter les données comme:

  public Employee(int EMPLOYEENUM, string NAME, string ADRESS, double WAGE, double HOURS)
        {
            EmployeeNum = EMPLOYEENUM;
            Name = NAME;
            Address = ADRESS;
            Wage = WAGE;
            Hours = HOURS;
        }

ou vous pouvez l'ajouter à l'aide de l'ensemble en tapant. nom_variable après le nom de l'instance (si elles sont publiques et si elles ont un ensemble, cela fonctionnera). pour lire les données, vous pouvez utiliser get en tapant .variablename après le nom de l’instance (s’ils sont publics et qu’ils obtiennent un get, cela fonctionnera).

3
TeD van Loon