c#加载csv文件和排序列
我有一个datagridview
设置元素和一些标识特征作为列标题。c#加载csv文件和排序列
Col 1 Col 2 Col 3 4 5 6 7 ...
Sample , Symbol, Symbol Color, Na, K, Mg, Mn...
我目前可以加载CSV
或text tab delimited
文件,但格式必须匹配DataGridView的。有没有办法按随机顺序加载column headers
元素数据的CSV
,然后将它们放在你想要的列中。
Na, K, Mg, Mn....
88, 5, 6, 16...
56, 7, 33, 12...
是否有可能,如果数据是在一个不同的顺序把它分类到现有datagridview
的格式:
目前,CSV必须在相同的顺序datagridview
被格式化:
Mg, Mn, Na, K....
6, 16, 88, 5...
33, 12, 56, 7...
有时可能会缺少导入文件中的列,那就没关系。我已经想出了如何隐藏空数据的列。
我建议使用一些文件库,如FileHelper来执行操作。它的免费和开源与一些伟大的东西,如读csv
或任何格式化的数据文件,异步读取数据,定义column
实体的订单。
编辑:
-
处理缺少的值:创建自定义处理程序来处理缺失值,也可以定义的数据为
nullable
欲了解更多信息http://www.filehelpers.net/example/MissingValues/MissingValuesNullable/ -
自定义命令:使用
ColumnOrder
属性来定义列顺序
它如何解决更改列顺序或缺少列问题? –
这是一个非常简单的方法。
先创建一个这样的类;
private class MyColumns
{
public string Na { get; set; }
public string K { get; set; }
public string Mg { get; set; }
public string Mn { get; set; }
}
然后你就可以分析您的CSV这样。
var allLines = File.ReadAllLines(@"C:\kosalaw\myfile.csv"); //read all lines from the csv file
MyColumns[] AllColumns = new MyColumns[allLines.Count() -1]; //create an array of MyColumns class
var colHeaders = allLines[0].Split(new[]{"\",\""},StringSplitOptions.None).ToList(); // Identify columns headers
for (int index = 1; index < allLines.Length; index++)//loop through the lines. We skip first line as it is the column header
{
var line = allLines[index];
var lineColumns = line.Split(new[] { "\",\"" }, StringSplitOptions.None); //split each line in to columns
AllColumns[index - 1] = new MyColumns //now use column header to identify the exact column.
{
K = lineColumns[colHeaders.IndexOf("K")],
Mg = lineColumns[colHeaders.IndexOf("Mg")],
Mn = lineColumns[colHeaders.IndexOf("Mn")],
Na = lineColumns[colHeaders.IndexOf("Na")]
};
}
.Split()很少是解析csv数据的好方法。速度很慢,并且几乎总是会遇到边缘情况,并且会与真实世界的数据相冲突。 –
这种情况的任何例子? –
最主要的是包含逗号或换行符作为数据一部分的字段,无论它们是否被引用或转义,但也有其他方式来打破它。 –
你使用任何库吗?或者只是.NET文件IO来读取'csv'文件? – Mainul