#c# #wpf #csv #datagrid
#c# #wpf #csv-файл #datagrid
Вопрос:
Я работаю с приложением, в котором я загружаю CSV-файл в сетку данных (WPF). Чего я не понимал до того, как начал, так это того, что он содержит нулевые значения, которые меня на самом деле не волнуют, когда дело доходит до отображения. Как я могу добавить проверку в свой код, чтобы он отфильтровывал нулевые значения?
//location of CSV File
string CSVDataBase = @"C:covid19_confirmed_global.csv";
//create collection for DataGrid source
async Task<ICollection> CreateDataSource()
{
//create new DataTables and rows
DataTable dataTable = new DataTable();
DataRow dataRow;
//create column headers
dataTable.Columns.Add(new DataColumn("Country/Region", typeof(string)));
dataTable.Columns.Add(new DataColumn("Province/State", typeof(string)));
dataTable.Columns.Add(new DataColumn("Number of Cases", typeof(string)));
dataTable.Columns.Add(new DataColumn("Confirmed Date", typeof(string)));
//split lines at delimiter ','
foreach (string Line in await File.ReadAllLinesAsync(CSVDataBase))
{
//create new row
dataRow = dataTable.NewRow();
//Country/Region
dataRow[0] = Line.Split(',').ElementAt(1);
//Province/State
dataRow[1] = Line.Split(',').ElementAt(0);
//Number of Cases
dataRow[2] = Line.Split(',').ElementAt(2);
//Confirmed Date
dataRow[3] = Line.Split(',').ElementAt(3);
//add the row created
dataTable.Rows.Add(dataRow);
}
//return dataview
DataView dataView = new DataView(dataTable);
return dataView;
}
//button load CSV file
private async void btnDisplayData_Click(object sender, RoutedEventArgs e)
{
CovidInfoDataGrid.ItemsSource = await CreateDataSource();
}
Первые два столбца в DataGrid перевернуты, потому что первый столбец в CSV-файле — это провинция / штат, а второй столбец — Страна / регион. В DataGrid я хочу, чтобы они были противоположными.
Я добавил CSV-файл для лучшего понимания: CSV-файл
Образец с данными, кроме нулей: тот же CSV-файл, но со значимыми данными.
Вот как это должно выглядеть в конце: требуемый результат
Комментарии:
1. Что вы подразумеваете под нулевыми значениями? Пустая строка? или пустая ячейка? Или что именно?
2. Кстати, я не специалист по производительности, но вы разделяете каждую строку 4 раза. Было бы дешевле, если бы вы разделили его только один раз на массив или около того.
3. «Ноль» означает 0, а не «null». Насколько я могу судить, просматривая ячейки визуально, внутри столбцов «Количество обращений» нет пустых «нулевых» ячеек.
4. В названии вопроса указано «null», поэтому я был в замешательстве.
5. Это исправило заголовок. Извините.
Ответ №1:
Не уверен, правильно ли я вас понял, но:
string[] lines = await File.ReadAllLinesAsync(CSVDataBase);
string[] dates = lines[0].Split(',');
for (int i = 1; i < lines.Length; i )
{
string[] cells = lines[i].Split(',');
for (int j = 2; j < cells.Length; j )
{
if (cells[j] == "0")
{
continue;
}
dataRow = dataTable.NewRow();
dataRow[0] = cells[1];
dataRow[1] = cells[0];
dataRow[2] = cells[j];
dataRow[3] = dates[j];
dataTable.Rows.Add(dataRow);
}
}
Посмотрите, работает ли это — хотя для этого требуется Linq
Отредактировано… В идеале вы должны проанализировать дату в объект Date и затем передать ее в строку в качестве ячейки даты. Кроме того, порядок строк может быть не таким, как вы указали на скриншоте, но как только он появится в таблице данных, упорядочение по определенному столбцу должно быть простым.
Комментарии:
1. Спасибо, но это выглядит странно: bbcode0.com/full/2021/3/11 /… P.S. У меня был AutoGenerateColumns=»False», в этом и была проблема.
2. Что произойдет, если вы загрузите только 3 или 4 строки?
3. Вот что он показывает сейчас: bbcode0.com/full/2021/3/11 /…
4. Можете ли вы опубликовать несколько строк из вашего CSV-файла?
5. Это есть в оригинальном сообщении внизу.