c#加载csv文件并对列进行排序

时间:2016-02-12 03:28:10

标签: c# visual-studio csv datagridview

我设置了datagridview元素和一些识别特征作为列标题。

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

我目前可以加载CSVtext tab delimited个文件,但格式必须与datagridview匹配。有没有办法以随机顺序加载带有CSV的{​​{1}}元素数据,然后将它们放在您想要的列中。

目前,csv的格式必须与column headers

的顺序相同
datagridview

是否有可能,如果数据的顺序不同,则将其排序为现有Na, K, Mg, Mn.... 88, 5, 6, 16... 56, 7, 33, 12... 的格式:

datagridview

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

2 个答案:

答案 0 :(得分:-1)

我建议使用像FileHelper这样的文件库来执行操作。它是免费的和开源的,有一些很棒的东西,如阅读csv或任何格式化的数据文件,异步读取数据,定义实体的column顺序。

修改

  1. 处理缺失值:创建自定义处理程序以处理缺失值,或者可以将数据定义为nullable以获取更多信息http://www.filehelpers.net/example/MissingValues/MissingValuesNullable/
  2. 自定义订单:使用ColumnOrder属性定义列顺序

答案 1 :(得分:-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")]
            };
        }