2017-11-24 9 views
0

CSVファイルの既存のデータに影響を与えることなく、最初の行に新しい2行を挿入します。既存の行に影響を与えずに既存のCSVファイルに新しい行を追加する方法

例えば: 既存のCSVファイル形式:

Name  Address  Value 
-------------------------------- 
abc  India  123 
XXX  USA   456 

は、既存のCSVファイルの列ヘッダの前に新しい行を挿入する必要があります。 は、例えば:

Name  Address  Value 
    -------------------------------- 
    abc  India  123 
    XXX  USA   456 

しかし、行の上に2つの行を追加する必要があります。私は唯一の列と行の下に作成することができ、このコードを使用して&をCSVファイルを作成するための

Line1-A ---> Need to add this line before column. 
    Line2-B ---> Need to add this line before column. 

    Name  Address  Value 
    -------------------------------- 
    abc  India  123 
    XXX  USA   456 

私の既存のコード。

using System; 
using System.Collections.Generic; 
using System.Data; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace WindowsFormsApplication1 
{ 
    public class CreateCSVFile 
    { 
     #region Create .csv File ANDON - DASHBOARD 
     public void CreateFile(HistorianData objHistorian) 
     { 
      try 
      { 
       CreateCSVFile obj = new CreateCSVFile(); 
       StringBuilder sb = new StringBuilder();    

       DataTable dt = obj.GetData(objHistorian); 


       foreach (DataRow dr in dt.Rows) 
       { 
        foreach (DataColumn dc in dt.Columns) 
         sb.Append(obj.FormatCSV(dr[dc.ColumnName].ToString()) + ","); 
        sb.Remove(sb.Length - 1, 1); 
        sb.AppendLine(); 
       } 

       //Create .csv File: 
       string fileName = objHistorian.getTagName + "_" + "_" + DateTime.UtcNow.ToString("yyyy-MM-ddTHH_mm_ssZ") + ".csv";    
       string path = @"C:\Documents\" + fileName; 



       if (!File.Exists(path)) 
       { 
        DataTableToCreateCSVFile(dt, path);      
       } 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine("Error :" + ex.StackTrace, ex.Message); 
      } 
     } 


     public DataTable GetData(HistorianData fields) 
     { 
      DataTable dt = new DataTable(); 
      dt.Columns.Add("Tagname", typeof(string)); 
      dt.Columns.Add("TimeStamp", typeof(string)); 
      dt.Columns.Add("Value", typeof(string)); 
      dt.Columns.Add("DataQuality", typeof(string)); 
      dt.Rows.Add(fields.getTagName, fields.timeStamp, fields.getPropertyValue, fields.dataQuality); 
      return dt; 
     } 

     public string FormatCSV(string input) 
     { 
      try 
      { 
       if (input == null) 
        return string.Empty; 

       bool containsQuote = false; 
       bool containsComma = false; 
       int len = input.Length; 
       for (int i = 0; i < len && (containsComma == false || containsQuote == false); i++) 
       { 
        char ch = input[i]; 
        if (ch == '"') 
         containsQuote = true; 
        else if (ch == ',') 
         containsComma = true; 
       } 

       if (containsQuote && containsComma) 
        input = input.Replace("\"", "\"\""); 

       if (containsComma) 
        return "\"" + input + "\""; 
       else 
        return input; 
      } 
      catch 
      { 
       throw; 
      } 
     } 

     public void DataTableToCreateCSVFile(DataTable dtDataTable, string strFilePath) 
     { 
      StreamWriter sw = new StreamWriter(strFilePath, false); 
      //headers 
      for (int i = 0; i < dtDataTable.Columns.Count; i++) 
      { 
       sw.Write(dtDataTable.Columns[i]); 
       if (i < dtDataTable.Columns.Count - 1) 
       { 
        sw.Write(","); 
       } 
      } 
      sw.Write(sw.NewLine); 
      foreach (DataRow dr in dtDataTable.Rows) 
      { 
       for (int i = 0; i < dtDataTable.Columns.Count; i++) 
       { 
        if (!Convert.IsDBNull(dr[i])) 
        { 
         string value = dr[i].ToString(); 
         if (value.Contains(',')) 
         { 
          value = String.Format("\"{0}\"", value); 
          sw.Write(value); 
         } 
         else 
         { 
          sw.Write(dr[i].ToString()); 
         } 
        } 
        if (i < dtDataTable.Columns.Count - 1) 
        { 
         sw.Write(","); 
        } 
       } 
       sw.Write(sw.NewLine); 
      } 
      sw.Close(); 
     } 

     #endregion 
    } 

    public class HistorianData 
    { 
     public string getTagName { get; set; } 
     public DateTime timeStamp { get; set; } 
     public string dataQuality { get; set; } 
     public string getPropertyValue { get; set; } 
    } 

} 

答えて

0

この方法を試すことができます。ファイルへMemoryStreamからすべてのバイトを、新しい行を追加し、ファイルの内容を読み、書くことMemoryStreamを使用します。

string filePath = @"C:\Test\test.csv"; 
string csvLine = "value1; value2; value3" + Environment.NewLine; 
byte[] csvLineBytes = Encoding.Default.GetBytes(csvLine); 
using (MemoryStream ms = new MemoryStream()) 
{ 
     ms.Write(csvLineBytes , 0, csvLineBytes.Length); 
     using (FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read)) 
     {       
      byte[] bytes = new byte[file.Length]; 
      file.Read(bytes, 0, (int)file.Length); 
      ms.Write(bytes, 0, (int)file.Length);      
     } 

     using (FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Write)) 
     { 
      ms.WriteTo(file); 
     } 
} 
+0

感謝の多くを。うまく動作する – dhamo

関連する問題