假设我有一个包含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;
}
答案 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);
}
}
}