Citirea unui fișier text utilizând OpenFileDialog în formulare Windows (Programare, C#, Openfiledialog)

xavi a intrebat.

Sunt nou în ceea ce privește funcția OpenFileDialog, dar am înțeles elementele de bază. Ceea ce trebuie să fac este să deschid un fișier text, să citesc datele din fișier (numai text) și să plasez corect datele în casete de text separate în aplicația mea. Iată ce am în gestionarul de evenimente „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());
    }
}

Fișierul text pe care trebuie să îl citesc este acesta (pentru temă, trebuie să citesc exact acest fișier), Acesta are un număr de angajat, nume, adresă, salariu și ore lucrate:

1
John Merryweather
123 West Main Street
5.00 30

În fișierul text care mi-a fost dat, mai sunt încă 4 angajați cu informații imediat după acesta, în același format. Se poate observa că salariul și orele angajatului sunt pe aceeași linie, nu este o greșeală de scriere.

Am aici o clasă de angajați:

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
    }
}

Deci, trebuie să extrag textul din acel fișier în clasa mea de angajați, apoi să trimit datele în caseta de text corectă din aplicația Windows Forms. Am probleme în a înțelege cum să fac acest lucru corect. Trebuie să folosesc un streamreader? Sau există o altă modalitate mai bună în acest caz? Vă mulțumesc.

Comentarii

  • Constructorul dvs. ar trebui să fie public Employee() și nu public void employeeConst() –  > Por Phil Carson.
  • Utilizați StreamReader și apelați ReadLine –  > Por David Heffernan.
2 răspunsuri
jordanhill123

Iată o modalitate:

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

Modificat de aici:MSDN OpenFileDialog.OpenFile

EDITARE Iată o altă modalitate mai potrivită pentru nevoile tale:

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

Comentarii

  • Vă mulțumesc! Deci, o întrebare. Nu pot să analizez linie cu linie în clasa de angajați, deoarece fișierul text are salariul angajatului ȘI orele angajatului pe aceeași linie, separate de un spațiu. Aș putea folosi metoda .Split() pentru a separa salariul și orele? –  > Por xavi.
  • Da, ar trebui să funcționeze folosind .Split() metoda de separare a salariului și a orelor. –  > Por jordanhill123.
  • Am adăugat un cod care va funcționa dacă la fiecare 4 linii este un nou angajat pentru analiza ca exemplu cu .Split() metoda –  > Por jordanhill123.
TeD van Loon

pentru această abordare, va trebui să adăugați system.IO la referințele dvs. prin adăugarea următoarei linii de cod sub celelalte referințe, aproape de partea de sus a fișierului c#(unde stau celelalte folosind ****.**).

using System.IO;

acest cod următor conține 2 metode de citire a textului, prima va citi linii individuale și le va stoca într-o variabilă de tip string, a doua citește întregul text și îl salvează într-o variabilă de tip string(inclusiv „
” (intră))

ambele ar trebui să fie destul de ușor de înțeles și de utilizat.


    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
            }
        }
    }

Pentru a împărți textul, puteți folosi .Split(” „) și o buclă pentru a pune numele înapoi într-un singur șir de caractere. Dacă nu doriți să folosiți .Split(), puteți folosi foreach și o instrucțiune if pentru a împărți textul acolo unde este necesar.


pentru a adăuga datele în clasa dvs. puteți folosi constructorul pentru a adăuga datele, de exemplu:

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

sau le puteți adăuga folosind set, tastând .variablename după numele instanței (dacă sunt publice și au un set, acest lucru va funcționa). pentru a citi datele, puteți folosi get, tastând .variablename după numele instanței (dacă sunt publice și au un get, acest lucru va funcționa).

Comentarii

  • Vă mulțumim pentru acest indiciu! Încercam să-mi dau seama de ce referință am nevoie pentru a face acest lucru să funcționeze. –  > Por Shrout1.