#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;