2017-06-01 6 views
0

70行の.csvファイルがあるとしますが、必要なのは5行だけです。私は、私が望む列名の文字列配列をメソッドに渡すことができ、それがデータテーブルを返すことができるようにしたい。あなたはhttps://joshclose.github.io/CsvHelper/列名の文字列配列を使用して、.csvファイルをDataTableに読み込むにはどうすればよいですか?

で見ることができ

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

を通してあなたを取得する必要があります - あなたはOLEDBを使用してインポート&だけで選択することができますあなたが望む列。 https://stackoverflow.com/questions/6813607/parsing-csv-using-oledb-using-c-sharp – PaulF

+0

素晴らしいアイデアのようです@PaulF。 [例](https://stackoverflow.com/questions/6813607/parsing-csv-using-oledb-using-c-sharp)です。 –

+0

CSVにヘッダファイルがない場合は、同じフォルダにschema.iniファイルを指定してフィールド名とタイプを指定することができます。 https://docs.microsoft.com/en-us/sql/odbc/microsoft/schema-ini-file-text-file-driver – PaulF

答えて

0

ファイルの最初の行line.Split(',')(または区切り文字が何であれ)を読み取り、各列名のインデックスを取得して格納します。 その後、行ごとにvar values = line.Split(',')を実行し、列から値を取得します。

クイックと汚いのバージョンは:

他の人がCsvReaderのようなライブラリを述べてきたように
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 
} 
+0

このバージョンのポイントは、Timが動的列ヘッダーを使用できることを確認することでした。彼が尋ねたような配列。 – Para

0

は、個々のフィールドを読むこと私たちは簡単に多くのコードを記述せずにこれを行うことができ、何を

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

このために使用することができます。 linqについては、私はこの種の仕事に適しているとは思わない。

私はこれをテストしていませんが、それは、私はこれを試していないが、CSVファイルには、ヘッダ・レコードを持っている場合

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); 
     } 
    } 
} 
関連する問題