2017-06-23 19 views
1

データマッピングを格納するテーブルがあります。そのための私のモデルは、この表の目的は、私はそれらのフィールドを持つオブジェクトを作成できるようにCSVファイルからのマッピングを格納することですので、フィールドマッピングを使用してDataTableから新しいオブジェクトを作成

public class MapperTable 
{ 
    public string EE_First_Name {get; set;} 
    public string EE_Last_Name {get; set;} 
    public string EE_MI {get; set;} 
} 

のように見えます。 だから、CSVでの最初の名前フィールドは、姓*それは私のテーブルにマッチし、その後、私は姓の*からの値を持つ新しいオブジェクトを作成し、EE_First_Name

enter image description here

イムにフィールド名を設定されているがある場合IDを介してマッピングを保存し、ユーザーがIdを選択すると、その特定のマッピングを使用してcsvからデータをマップします。

public MapperTableConvertCsvUsingMap(DataTable csv){ 
    var namesFromColumnCsvMap = DataAccess.ExportCsvMaps.FindByExp(x => x.ConfigId == idINt).FirstOrDefault(); 

    foreach(DataRow row in Csv.Rows) 
    { 
     var csvMapped = new MapperTable { 
      EE_First_Name = row[namesFromColumnCsvMap.EE_First_Name__.TrimEnd()].ToString(), 
      EE_Last_Name__ = row[namesFromColumnCsvMap.EE_Last_Name__.TrimEnd()].ToString(), 
      EE_MI = row[namesFromColumnCsvMap.EE_MI.TrimEnd()].ToString(), 
     }; 
    } 

すべての列が正しくマップされている場合に機能します。彼らが正確に一致しない場合、それは爆発する。新しいオブジェクトを作成するために、csvの列ヘッダーと私のテーブルに格納された列ヘッダー定義を照合するより良い方法は何でしょうか?

私はそれは、列マッピングはプロセスように、データベースに格納されますする必要があり、この

enter image description here

のように見える必要があり、この

enter image description here

のように見えるcsvファイルを持っています繰り返すことができる。受信したcsvは、示されているものと異なる場合がありますが、データベースに格納されている値を使用して最後のCSVにマップできる必要があります。

+0

「着信CSVは、示されているCSVとは異なる可能性がありますが、マッピング可能である必要があります。あなたは最終結果を示しています.CSVのさまざまなフォーマットがどのように見えるのか?あなたは結果ではなく、データの摂取に集中する必要があります。合理的な回答を提供するのに十分な摂取情報はありません。 – OmegaMan

+0

私が言っている意味は、「__First__Name」という名前の列が「EE FIrst Name *」にマッピングされているというデータベースにマッピングがある場合、csvが入力されたときに、csvからデータを読み取り、そのフィールドに割り当てます新しいオブジェクトで –

答えて

1

最初に、アクセスしようとする前に、マッピングするテーブル/ csvにその列が存在することを確認します。カラムが存在する場合はそのカラムにアクセスしたり、空の文字列""などのデフォルト値を返します。

public MapperTable[] ConvertCsvUsingMap(DataTable csv) { 
    var namesFromColumnCsvMap = DataAccess.ExportCsvMaps.FindByExp(x => x.ConfigId == idINt).FirstOrDefault(); 

    foreach (DataRow row in csv.Rows) { 
     var csvMapped = new MapperTable { 
      EE_First_Name = namesFromColumnCsvMap.EE_First_Name != null && csv.Columns.Contains(namesFromColumnCsvMap.EE_First_Name.TrimEnd()) ? row[namesFromColumnCsvMap.EE_First_Name.TrimEnd()].ToString() : "", 
      EE_Last_Name = namesFromColumnCsvMap.EE_Last_Name != null csv.Columns.Contains(namesFromColumnCsvMap.EE_Last_Name.TrimEnd()) ? row[namesFromColumnCsvMap.EE_Last_Name.TrimEnd()].ToString() : "", 
      EE_MI = namesFromColumnCsvMap.EE_MI != null && csv.Columns.Contains(namesFromColumnCsvMap.EE_MI.TrimEnd()) ? row[namesFromColumnCsvMap.EE_MI.TrimEnd()].ToString() : "", 
     }; 

     //... 
    } 
} 

マッピングされた列名は、テーブルに存在することを最初に確認する上記のコードは、行の値を取得しようとする前にマッピングされます。一致するものが見つからない場合は、マップされたオブジェクトプロパティを空の文字列に設定します。

関連する問題