![](/img/trans.png)
[英]Using WriteAllText How To Write DataTable Column Names To CSV File
[英]Given string array of column names, how do I read a .csv file to a DataTable?
假设我有一个包含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;
}
您可以查看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" );
}
我们无需编写太多代码就可以轻松地做到这一点。
Exceldatareader是一个很棒的dll,它将仅通过一种方法直接作为Excel工作表中的datable。
例如,以下是链接: http : //www.c-sharpcorner.com/blogs/using-iexceldatareader1
http://exceldatareader.codeplex.com/
希望它有用,让我知道您的想法或反馈
谢谢
KARTHIK
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];
读取文件的第一行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
}
正如其他人所说的那样,可以使用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);
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.