给定列名称的字符串数组,如何将.csv文件读取到DataTable?

时间:2017-06-01 16:26:31

标签: c# linq csv

假设我有一个包含70列的.csv文件,但只有5列是我需要的。我希望能够传递一个方法,我想要的列名称的字符串数组,并返回一个数据表。

private void method(object sender, EventArgs e) {
    string[] columns =
    {
        @"Column21",
        @"Column48"
    };
    DataTable myDataTable = Get_DT(columns);
}

public DataTable Get_DT(string[] columns) {
    DataTable ret = new DataTable();
    if (columns.Length > 0) 
    {
        foreach (string column in columns)
        {
              ret.Columns.Add(column);
        }

        string[] csvlines = File.ReadAllLines(@"path to csv file");
        csvlines = csvlines.Skip(1).ToArray();  //ignore the columns in the first line of the csv file

        //this is where i need help... i want to use linq to read the fields
        //of the each row with only the columns name given in the string[] 
        //named columns
    }
    return ret;
}

5 个答案:

答案 0 :(得分:0)

您可以查看https://joshclose.github.io/CsvHelper/

思考阅读个别领域是您正在寻找的

var csv = new CsvReader( textReader );
while( csv.Read() )
{
    var intField = csv.GetField<int>( 0 );
    var stringField = csv.GetField<string>( 1 );
    var boolField = csv.GetField<bool>( "HeaderName" );
}

答案 1 :(得分:0)

我们可以轻松地完成此操作而无需编写太多代码。

Exceldatareader是一个非常棒的dll,只需一种方法就能直接作为excel表的数据。

这里是链接,例如: http://www.c-sharpcorner.com/blogs/using-iexceldatareader1

http://exceldatareader.codeplex.com/

希望它有用,请让我知道您的想法或反馈

由于

KARTHIK

答案 2 :(得分:0)

var data = File.ReadAllLines(@"path to csv file");
// the expenses row
var query = data.Single(d => d[0] == "Expenses");
//third column
int column21 = 3;
return query[column21];

答案 3 :(得分:0)

读取文件的第一行line.Split(',')(或者您的分隔符是什么),然后获取每个列名的索引并存储它。 然后对于每一行,再次执行var values = line.Split(','),然后从列中获取值。

快速而肮脏的版本:

string[] csvlines = File.ReadAllLines(@"path to csv file");
//select the indices of the columns we want
var cols = csvlines[0].Split(',').Select((val,i) => new { val, i }).Where(x => columns.Any(c => c == x.val)).Select(x => x.i).ToList();
//now go through the remaining lines
foreach (var line in csvlines.Skip(1))
{
    var line_values = line.Split(',').ToList();
    var dt_values = line_values.Where(x => cols.Contains(line_values.IndexOf(x)));
    //now do something with the values you got for this row, add them to your datatable
}

答案 4 :(得分:0)

正如其他人所说,可以使用像CsvReader这样的库。至于linq,我认为它不适合这种工作。

我没有对此进行过测试,但它应该可以帮助您完成

using (TextReader textReader = new StreamReader(filePath))
{
    using (var csvReader = new CsvReader(textReader))
    {
        var headers = csvReader.FieldHeaders;
        for (int rowIndex = 0; csvReader.Read(); rowIndex++)
        {
            var dataRow = dataTable.NewRow();
            for (int chosenColumnIndex = 0; chosenColumnIndex < columns.Count(); chosenColumnIndex++)
            {
                for (int headerIndex = 0; headerIndex < headers.Length; headerIndex++)
                {
                    if (headers[headerIndex] == columns[chosenColumnIndex])
                    {
                        dataRow[chosenColumnIndex] = csvReader.GetField<string>(headerIndex);
                    }
                }
            }
            dataTable.Rows.InsertAt(dataRow, rowIndex);
        }
    }
}