2017-09-29 13 views
0

C#の辞書に2つの列を抽出したいと思います。私は以下を試した。空白行を読み込むと失敗します。それを達成するためのよりクリーンな方法がありますか?私はここで他の値については気にしない。ただAR IDからAR Typeへのマッピングがあります。sparse csvファイルから辞書を抽出する

 public class Table 
    { 
     private Dictionary<string, string> _ARID_ARTypeValues = new Dictionary<string, string>(); 
     private string _arId; 

     public Table(string arId) 
     { 
      _arId = arId; 
     } 

     public void AddValue(string key, string value) 
     { 
      _ARID_ARTypeValues.Add(key, value); 
     } 
    } 

    public static IDictionary ParseCsvFile(StreamReader reader) 
    { 
     Dictionary<string, Table> tables = new Dictionary<string, Table>(); 

     // First line contains column names. 
     var columnNames = reader.ReadLine().Split(','); 
     for (int i = 1; i < columnNames.Length; ++i) 
     { 
      var columnName = columnNames[i]; 
      var ntable = new Table(columnName); 
      if ((columnName == "AR ID") || (columnName == "AR Type")) 
      { 
       tables.Add(columnName, ntable); 
      } 
     } 

     var line = reader.ReadLine(); 
     while (line != null) 
     { 
      var columns = line.Split(','); 

      for (int j = 1; j < columns.Length; ++j) 
      { 
       var table = tables[columnNames[j]]; 
       table.AddValue(columns[0], columns[j]); 
      } 
      line = reader.ReadLine(); 
     } 
     return tables; 
    } 

sample csv

+0

空白行に失敗した場合は、処理する前に行が空白かどうかを確認するだけではどうですか? – Chris

答えて

1

私はちょうどCsvHelperのように、CSVライブラリを使用しているとのcsvファイルを読んでいました。

Dictionary<string, string> arIdToArTypeMapping = new Dictionary<string, string>(); 

using (var sr = File.OpenText("test.csv")) 
{ 
    var csvConfiguration = new CsvConfiguration 
    { 
     SkipEmptyRecords = true 
    }; 

    using (var csvReader = new CsvReader(sr, csvConfiguration)) 
    { 
     while (csvReader.Read()) 
     { 
      string arId = csvReader.GetField("AR ID"); 
      string arType = csvReader.GetField("AR Type"); 

      if (!string.IsNullOrEmpty(arId) && !string.IsNullOrEmpty(arType)) 
      { 
       arIdToArTypeMapping.Add(arId, arType); 
      } 
     } 
    } 
} 
1

あなたはCinchoo ETLを使用することができます - オープンソースのライブラリを、CSVファイルを読み、

using (var parser = new ChoCSVReader("Dict1.csv") 
    .WithField("AR_ID", 7) 
    .WithField("AR_TYPE", 8) 
    .WithFirstLineHeader(true) 
    .Configure(c => c.IgnoreEmptyLine = true) 
    ) 
{ 
    var dict = parser.ToDictionary(item => item.AR_ID, item => item.AR_TYPE); 
    foreach (var kvp in dict) 
     Console.WriteLine(kvp.Key + " " + kvp.Value); 
} 

の下に示し数行のコードを持つような単純な辞書にそれらを変換するためには、この情報がお役に立てば幸いです。

免責事項:私はこのライブラリの作者です。

関連する問題