2016-06-27 18 views
0

CSVヘルパーライブラリを使用して、ユーザーに というCSVファイルを生成し、システムに読み込んでアップロードします。私の問題は、WriteHeaderメソッドは、ユーザーフレンドリーではない "PropertyValue"のような名前のクラスの属性を単に書き込むことです。作成したテキストをユーザーフレンドリーにするために使用できるメソッドはありますか?それでもクラスをファイルデータに正常にマップできますか?私は私がで生産するテキストを置くために私のPropertyUploadCSVRowHelperクラスの各属性の上に置くことができるtheresのいくつかのメタデータタグか何かあれば、私は思ったんだけどC言語でCSVHelperを使用してCSVファイルのヘッダー名を変更する

public ActionResult UploadPropertyCSV(HttpPostedFileBase file) 
    { 
     List<PropertyModel> properties = new List<PropertyModel>(); 
     RIMEDb dbContext = new RIMEDb(); 
     bool success = false; 
     foreach (string requestFiles in Request.Files) 
     { 
      if (file != null && file.ContentLength > 0 && file.FileName.EndsWith(".csv")) 
      { 
       using(StreamReader str = new StreamReader(file.InputStream)) 
       { 
        using(CsvHelper.CsvReader theReader = new CsvHelper.CsvReader(str)) 
        { 
         while (theReader.Read()) 
         { 
          RIMUtil.PropertyUploadCSVRowHelper row = new RIMUtil.PropertyUploadCSVRowHelper() 
          { 
           UnitNumber = theReader.GetField(0), 
           StreetNumber = theReader.GetField(1), 
           StreetName = theReader.GetField(2), 
           AlternateAddress = theReader.GetField(3), 
           City = theReader.GetField(4) 
          }; 

          Property property = new Property(); 
          property.UnitNumber = row.UnitNumber; 
          property.StreetNumber = row.StreetNumber; 
          property.StreetName = row.StreetName; 
          property.AlternateAddress = row.AlternateAddress; 
          property.City = dbContext.PostalCodes.Where(p => p.PostalCode1 == row.PostalCode).FirstOrDefault().City; 

          dbContext.Properties.Add(property); 
          try 
          { 
           dbContext.SaveChanges(); 
           success = true; 
          } 
          catch(System.Data.Entity.Validation.DbEntityValidationException ex) 
          { 
           success = false; 
           RIMUtil.LogError("Ptoblem validating fields in database. Please check your CSV file for errors."); 
          } 
          catch(Exception e) 
          { 
           RIMUtil.LogError("Error saving property to database. Please check your CSV file for errors."); 
          } 
         } 
        } 
       } 
      } 
     } 
     return Json(success); 
    } 

私のコードは次のようになります。これは私が生成するために使用する単純な関数である(あなたがcsvhelperを使用したいと述べたように、これは直接あなたの質問に答えることではないかもしれませんが、あなただけの小さなサイズのファイルを書いている場合は、事前

+0

[CsvHelper Mappings](https://joshclose.github.io/CsvHelper/#mapping)を調べてください。これは、あなたがあなたの質問に言及しているものです。 – Nkosi

答えて

0

感謝を提出csv。注意してください、 csvhelperは、文字列を作成してデータをストリーミングしないため、大きなファイルの方がはるかに優れています。

必要に応じて、以下のコードの列配列をカスタマイズしてください。 https://dotnetfiddle.net/2WHf6o

幸運:

public string GetCsv(string[] columns, List<object[]> data) 
{ 
    StringBuilder CsvData = new StringBuilder(); 

    //add column headers 
    string[] s = new string[columns.Length]; 
    for (Int32 j = 0; j < columns.Length; j++) 
    { 
     s[j] = columns[j]; 
     if (s[j].Contains("\"")) //replace " with "" 
      s[j].Replace("\"", "\"\""); 
     if (s[j].Contains("\"") || s[j].Contains(" ")) //add "'s around any string with space or " 
      s[j] = "\"" + s[j] + "\""; 
    } 
    CsvData.AppendLine(string.Join(",", s)); 

    //add rows 
    foreach (var row in data) 
    { 
     for (int j = 0; j < columns.Length; j++) 
     { 
      s[j] = row[j] == null ? "" : row[j].ToString(); 
      if (s[j].Contains("\"")) //replace " with "" 
       s[j].Replace("\"", "\"\""); 
      if (s[j].Contains("\"") || s[j].Contains(" ")) //add "'s around any string with space or " 
       s[j] = "\"" + s[j] + "\""; 
     } 
     CsvData.AppendLine(string.Join(",", s)); 
    } 

    return CsvData.ToString(); 

} 

は、ここでそれを使用する方法のフィドル一例です。

+0

自分の問題を説明するのに役立つコード変更を追加しました。あなたの意見は良い解決策のように聞こえるが、CSVHelperライブラリを使用する必要がある。クラスの各属性のヘッダを記述する際に差分テキストを生成するために使用できるメタデータフィールドがあるかどうかを知っていますか? – Mark

関連する問題