2016-02-12 37 views
-1

我有一个datagridview设置元素和一些标识特征作为列标题。c#加载csv文件和排序列

Col 1 Col 2  Col 3   4 5 6 7 ... 
Sample , Symbol, Symbol Color, Na, K, Mg, Mn... 

我目前可以加载CSVtext 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... 

有时可能会缺少导入文件中的列,那就没关系。我已经想出了如何隐藏空数据的列。

+0

你使用任何库吗?或者只是.NET文件IO来读取'csv'文件? – Mainul

回答

-1

我建议使用一些文件库,如FileHelper来执行操作。它的免费和开源与一些伟大的东西,如读csv或任何格式化的数据文件,异步读取数据,定义column实体的订单。

编辑:

  1. 处理缺少的值:创建自定义处理程序来处理缺失值,也可以定义的数据为nullable欲了解更多信息http://www.filehelpers.net/example/MissingValues/MissingValuesNullable/
  2. 自定义命令:使用ColumnOrder属性来定义列顺序
+0

它如何解决更改列顺序或缺少列问题? –

-1

这是一个非常简单的方法。

先创建一个这样的类;

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")] 
      }; 
     } 
+1

.Split()很少是解析csv数据的好方法。速度很慢,并且几乎总是会遇到边缘情况,并且会与真实世界的数据相冲突。 –

+0

这种情况的任何例子? –

+0

最主要的是包含逗号或换行符作为数据一部分的字段,无论它们是否被引用或转义,但也有其他方式来打破它。 –