簡體   English   中英

Append 數據到 a.csv 文件使用 C#

[英]Append data to a .csv File using C#

以下代碼寫入數據並且工作正常,但我想在 .csv 文件中添加多個客戶端(可能是 10 個)。 我怎樣才能做到這一點。 提前致謝。

private void createFileButton_Click(object sender, EventArgs e)
{
    string newFileName = "C:\\client_20100913.csv";

    string clientDetails = clientNameTextBox.Text + "," + mIDTextBox.Text + "," + billToTextBox.Text;

    //Header of the .csv File
    string clientHeader = "Client Name(ie. Billto_desc)" + "," + "Mid_id,billing number(ie billto_id)" + "," + "business unit id" + Environment.NewLine;

    File.WriteAllText(newFileName, clientHeader);
    File.AppendAllText(newFileName, clientDetails);

    MessageBox.Show("Client Added", "Added", MessageBoxButtons.OK); 
}

如果要將客戶端信息附加到現有文件,請執行以下操作:

string newFileName = "C:\\client_20100913.csv";

string clientDetails = clientNameTextBox.Text + "," + mIDTextBox.Text + "," + billToTextBox.Text;


if (!File.Exists(newFileName))
{
    string clientHeader = "Client Name(ie. Billto_desc)" + "," + "Mid_id,billing number(ie billto_id)" + "," + "business unit id" + Environment.NewLine;

    File.WriteAllText(newFileName, clientHeader);
}

File.AppendAllText(newFileName, clientDetails);

這樣,標題行僅在創建文件時第一次寫入。

雖然提供列表詳細信息視圖可以更好地查看所有客戶端,添加和刪除客戶端,選擇客戶端編輯詳細信息,然后使用所有客戶端保存完整文件。

在我看來,您希望每次單擊按鈕時都添加新客戶端。

如果是這種情況,那么它當前不起作用的原因是該行正在清除該文件

File.WriteAllText(newFileName, clientHeader);

最簡單的改變是在寫入之前檢查文件是否存在:

if (!File.Exists(newFileName))
{
    //Header of the .csv File
    string clientHeader = "Client Name(ie. Billto_desc)" + "," + "Mid_id,billing number(ie billto_id)" + "," + "business unit id" + Environment.NewLine;

    File.WriteAllText(newFileName, clientHeader);
}

雖然您可以使用其他策略,例如在應用程序啟動時創建文件並保持打開(使用類似StreamWriter東西)。 然后,當您的應用程序退出時,您將關閉編寫器。 這幾乎可以保證在您的應用程序打開時不會弄亂文件。

您可能希望這樣做,因為該代碼中存在競爭條件 - 在您檢查文件存在之后,在您寫入文件之前,用戶可以刪除它。 保持文件打開有助於避免這種情況,但您可能想也可能不想這樣做。

我知道這已經得到了回答,但我做了一些創建訂閱者“日志”的方法。 這使用反射來獲取對象的屬性和值。 希望這可以幫助將來的某個人。

 internal static bool UpdateSubscriberList(MailingListEmail subscriber)
    {
        PropertyInfo[] propertyinfo;
        propertyinfo = typeof(MailingListEmail).GetProperties();
        var values = string.Empty;
        try
        {
            string fileName = @"C:\Development\test.csv";
            if (!File.Exists(fileName))
            {

                var header = string.Empty;
                foreach (var prop in propertyinfo)
                {
                    if (string.IsNullOrEmpty(header))
                        header += prop.Name;
                    else
                        header = string.Format("{0},{1}", header, prop.Name);


                }
                header = string.Format("{0},{1}", header, "CreatedDate");
                header += Environment.NewLine;
                File.WriteAllText(fileName, header);

            }


                foreach (var prop in propertyinfo)
                {
                    var value = prop.GetValue(subscriber, null);

                    if (string.IsNullOrEmpty(values))
                        values += value;
                    else
                        values = string.Format("{0},{1}", values, value);

                }
                values = string.Format("{0},{1}", values, DateTime.Now.ToShortDateString());

                values += Environment.NewLine;
                File.AppendAllText(fileName, values);



        }
        catch (Exception ex)
        {
            Elmah.ErrorSignal.FromCurrentContext().Raise(ex);
            return false;
        }


        return true;
    }

這就是我所做的,它對我來說非常有用:首先你需要從listview創建DataTable,或者只是從文本框中放入數據:

 `public Boolean PreparCVS(string DateOne, string DataTwo)
    {
        try
        {
        // Create the `DataTable` structure according to your data source

            DataTable table = new DataTable();
            table.Columns.Add("HeaderOne", typeof(string));
            table.Columns.Add("HeaderTwo", typeof(String));

            // Iterate through data source object and fill the table
            table.Rows.Add(HeaderOne, HeaderTwo);
            //Creat CSV File
            CreateCSVFile(table, sCsvFilePath);
            return true;
        }
        catch (Exception ex)
        {
            throw new System.Exception(ex.Message);
        }
    }`

創建dataTable后,您可以通過以下方法生成CSV文件:在streamwriter構造函數中,您必須在第二個參數True中指定,這樣您就可以將數據附加到現有的.csv文件中:

public void CreateCSVFile(DataTable dt, string strFilePath)
    {
        StreamWriter sw = new StreamWriter(strFilePath, true);

        int iColCount = dt.Columns.Count;
        for (int i = 0; i < iColCount; i++)
        {
            sw.Write(dt.Columns[i]);
            if (i < iColCount - 1)
            {
                sw.Write(",");
            }
        }
        sw.Write(sw.NewLine);

        foreach (DataRow dr in dt.Rows)
        {
            for (int i = 0; i < iColCount; i++)
            {
                if (!Convert.IsDBNull(dr[i]))
                {
                    sw.Write(dr[i].ToString());
                }
                if (i < iColCount - 1)
                {
                    sw.Write(",");
                }
            }
            sw.Write(sw.NewLine);
        }
        sw.Close();
    }

這里的根本問題似乎是您將數據附加到CSV文件的位置。 您的示例代碼看起來像是從頁面上的文本框中獲取各種數據,因此如果您想要多個客戶端,他們是否都會在屏幕上的文本框中顯示數據? 我的直覺可能不是。

這聽起來像你對我應該使用類某種(也許是保存在一個數據庫),然后的實施稱為像無效AppendToCSV(字符串文件名)類,其中附加客戶端數據到的方法來處理這個客戶數據CSV文件。 然后,您可以遍歷客戶端對象,依次附加每個對象。

與屏幕上的文本框相關,如何生成/存儲客戶端對象取決於應用程序嘗試實現的目標。

// At first read all the data from your first CSV

StreamReader oStreamReader = new StreamReader(@"d:\test\SourceFile.csv");
string recordsFromFirstFile = oStreamReader.ReadToEnd();
oStreamReader.Close();

// Now read the new records from your another csv file
oStreamReader = new StreamReader(@"d:\test\DestinationFile.csv");
string recordsFromSecondFile = oStreamReader.ReadToEnd();
oStreamReader.Close();
oStreamReader.Dispose();

// Here Records from second file will also contain column headers so we need to truncate them using Substring() method

recordsFromSecondFile = recordsFromSecondFile.Substring(recordsFromSecondFile.IndexOf('\n') + 1);

// Now merge the records either in SourceFile.csv or in Targetfile.csv or as per your required file

StreamWriter oStreamWriter= new StreamWriter(@"d:\testdata\TargetFile.csv");
oStreamWriter.Write(recordsFromFirstFile + recordsFromSecondFile);
oStreamWriter.Close();
oStreamWriter.Dispose();

快樂編碼.....

使用 CsvHelper;

公共無效 WriteDataToCsv(MsgEnvironmentData[] 數據,字符串 csvPath){

   if (!File.Exists(csvPath))
   {
     using (var writer = new StreamWriter(csvPath))
     using (var csvWriter = new CsvWriter(writer,firstConfiguration))
      {

          csvWriter.WriteHeader<MsgEnvironmentData>();
          csvWriter.NextRecord();
          csvWriter.WriteRecords(data);
      }
   }
   else
   {
       using (var stream = new FileStream(csvPath, FileMode.Append))
       using (var writer = new StreamWriter(stream))
       using (var csvWriter = new CsvWriter(writer, secondConfiguration))
        {
            csvWriter.WriteRecords(data);
        }
    }

}

Jeramy的回答在 csv 文件中的最后一個單元格中寫入內容,並從水平方向連續寫入內容。 我將他的解決方案與此處給出的答案混合並匹配。 我知道很久以前就有人問過這個問題,但是對於那些做研究的人,我在這里發布了答案。

string newFileName = @"C:\.NET\test.csv"; //filepath
var csv = new StringBuilder();
string clientDetails = "content1,content2,content3" + Environment.NewLine;
csv.Append(clientDetails);
File.AppendAllText(newFileName, csv.ToString());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM