将 CSV 文件加载到 DataGrid 时如何避免零 (0) 值?
How to avoid zero (0) values when loading a CSV file into DataGrid?
我正在使用一个应用程序将 CSV 文件加载到 DataGrid(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 文件中的第一列是 Province/State,第二列是 Country/Region。在 DataGrid 中,我希望它们是相反的。
我添加了 CSV 文件以便更好地理解:
CSV file
除零以外的数据示例:
The same CSV file but with meaningful data.
最后应该是这样的:
The required result
不确定我是否理解正确但是:
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 对象,然后将其作为日期单元格传递给行。
此外,行的顺序可能与您在屏幕截图中指示的不同,但一旦将其放入数据表中,根据特定列进行排序应该很容易。
我正在使用一个应用程序将 CSV 文件加载到 DataGrid(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 文件中的第一列是 Province/State,第二列是 Country/Region。在 DataGrid 中,我希望它们是相反的。
我添加了 CSV 文件以便更好地理解: CSV file
除零以外的数据示例: The same CSV file but with meaningful data.
最后应该是这样的: The required result
不确定我是否理解正确但是:
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 对象,然后将其作为日期单元格传递给行。 此外,行的顺序可能与您在屏幕截图中指示的不同,但一旦将其放入数据表中,根据特定列进行排序应该很容易。