Сортировка данных, полученных из CSV-файлов

#c# #list

#c# #Список

Вопрос:

Добрый день, мне дали задание, которое получает данные из файла CSV. CSV-файл содержит следующие записи: LName, FName, Dept, Grade, Валовая оплата, уплаченный налог, Чистая оплата.

Я могу извлечь данные и отобразить их в окне консоли, которое показано в моем коде ниже. Однако мне нужна помощь с отображением результатов в соответствии с отделом и получением общей чистой оплаты в каждом отделе. Существует три отдела M, R и S.

пример вывода

 class DisplayEmpData
{
    public void DisplayEmp()
    {
        Console.Clear();
        Console.WriteLine("****************************************************************************");
        Console.WriteLine("****************************************************************************");
        Console.WriteLine("**                                                                        **");
        Console.WriteLine("**                        Payroll System                           **");
        Console.WriteLine("**                        Employee Data Display                           **");
        Console.WriteLine("****************************************************************************");
        Console.WriteLine("****************************************************************************");
        List<string> columns;
        List<Dictionary<string, string>> myData = GetData(out columns);
        foreach (string column in columns)
        {
            Console.Write("{0,-9}", column);
        }
        Console.WriteLine();
        foreach (Dictionary<string, string> row in myData)
        {
            foreach (string column in columns)
            {
                Console.Write("{0,-9}", row[column]);
            }
            Console.WriteLine();
        }
        Console.ReadKey();
    }

    private static List<Dictionary<string, string>> GetData(out List<string> columns)
    {
        string line;
        string[] stringArray;
        char[] charArray = new char[] { ',' };
        List<Dictionary<string, string>> data = new List<Dictionary<string, string>>();
        columns = new List<string>();

        try
        {
            FileStream aFile = new FileStream(@"....EmployeeDetails.txt", FileMode.Open);
            StreamReader sr = new StreamReader(aFile);
            // Obtain the columns from the first line.
            // Split row of data into string array
            line = sr.ReadLine();
            stringArray = line.Split(charArray);
            for (int x = 0; x <= stringArray.GetUpperBound(0); x  )
            {
                columns.Add(stringArray[x]);
            }
            line = sr.ReadLine();
            while (line != null)
            {
                // Split row of data into string array
                stringArray = line.Split(charArray);
                Dictionary<string, string> dataRow = new Dictionary<string, string>();
                for (int x = 0; x <= stringArray.GetUpperBound(0); x  )
                {
                    dataRow.Add(columns[x], stringArray[x]);
                }
                data.Add(dataRow);
                line = sr.ReadLine();
            }
            sr.Close();
            return data;
        }
        catch (IOException ex)
        {
            Console.WriteLine("An IO exception has been thrown!");
            Console.WriteLine(ex.ToString());
            Console.ReadLine();
            return data;
        }
    }

}
  

Кто-нибудь, пожалуйста, может мне помочь?

Комментарии:

1. Мои выходные данные находятся в том же порядке, что и файл CSV.

Ответ №1:

Попробуйте загрузить данные в DataTable следующим образом:

     private static DataTable GetEmployeeData()
    {
        string line;
        string[] columnValues;
        char[] columnSeperator = new char[] { ',' };

        DataTable dt = new DataTable();

        try
        {
            FileStream employeeFile = new FileStream(@"....EmployeeDetails.txt", FileMode.Open);
            StreamReader sr = new StreamReader(employeeFile);

            // Obtain the columns from the first line.
            line = sr.ReadLine();
            columnValues = line.Split(columnSeperator);
            for (int x = 0; x <= columnValues.GetUpperBound(0); x  )
            {
                // Add the column to the table
                dt.Columns.Add(columnValues[x]);
            }

            line = sr.ReadLine();
            while (line != null)
            {
                // Split row of data into string array
                columnValues = line.Split(columnSeperator);

                // add a new row with all of the values
                dt.Rows.Add(columnValues);
            }

            sr.Close();
            return dt;
        }
        catch (IOException ex)
        {
            Console.WriteLine("An IO exception has been thrown!");
            Console.WriteLine(ex.ToString());
            Console.ReadLine();
            return dt;
        }
    }
  

Это упрощает работу с данными. Вы должны иметь возможность группировать строки по отделам примерно следующим образом:

         DataTable employeeData = GetEmployeeData();

        // Create a view based on the data so that we can sort it by Dept
        DataView view = employeeData.DefaultView;
        view.Sort = "Dept";

        if (!employeeData.Columns.Contains("Dept"))
        {
            Console.WriteLine("Employee Data file does not contain department column.");
            return;
        }

        // Print the column headers
        foreach (DataColumn column in employeeData.Columns)
        {
            Console.Write("{0,-9}", column.ColumnName);
        }
        Console.WriteLine();

        // Print each row in order
        foreach (DataRow row in view)
        {
            foreach (DataColumn column in employeeData.Columns)
            {
                Console.Write("{0,-9}", row[column]);
                Console.WriteLine();
            }
        }
        Console.ReadKey();
  

Комментарии:

1. я попробую. Меня беспокоит только одно — можно ли использовать таблицы данных в консольных приложениях? и может ли метод возвращать datatable? я получаю сообщение об ошибке, не удалось найти тип или имя пространства имен ‘Datatable’ (вам не хватает директивы using или ссылки на сборку?)

2. Я думаю, вы забыли добавить sr.ReadLine(); в свой цикл data For в методе GetEmployeeData.

3. @Fazleh: Вам нужно добавить using System.Collections.Generic;