使用C#将数据附加到.csv文件

时间:2010-09-13 15:36:25

标签: c# csv

以下代码写入数据并且工作正常,但我想在.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); 
}

6 个答案:

答案 0 :(得分:10)

如果要将客户端信息附加到现有文件,请执行以下操作:

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);

这样,标题行只会在创建文件时第一次写入。

虽然提供一个列表详细信息视图可以让您查看所有客户端,添加和删除客户端,选择一个客户端来编辑详细信息,然后将整个文件保存到所有客户端,这可能会更好。

答案 1 :(得分:1)

在我看来,每次点击按钮都希望添加新客户端。

如果是这种情况,那么它当前不起作用的原因是该行正在清除该文件

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的内容)。然后,当您的应用程序退出时,您将关闭编写器。这几乎可以保证在您的应用程序打开时不会弄乱文件。

您可能希望这样做,因为该代码中存在竞争条件 - 在您检查文件存在之后,在您写入文件之前,用户可以删除它。保持文件打开有助于避免这种情况,但您可能会或可能不想这样做。

答案 2 :(得分:0)

这里的潜在问题似乎是您将数据附加到CSV文件的位置。您的示例代码看起来像是从页面上的文本框中获取各种数据,因此如果您想要多个客户端,他们是否都会在屏幕上的文本框中显示数据?我的直觉可能不是。

听起来我应该使用某种类(可能是持久存储在数据库中)处理此客户端数据,然后在类中实现一个名为void AppendToCSV(string filename)的方法,该方法附加 客户端数据到CSV文件。然后,您可以遍历客户端对象,依次附加每个对象。

相对于屏幕上的文本框,您如何生成/存储客户端对象取决于您的应用尝试实现的目标。

答案 3 :(得分:0)

我知道这已经得到了回答,但我做了创建订阅者“日志”的工作。这使用反射来获取对象的属性和值。希望这可以帮助将来的某个人。

 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;
    }

答案 4 :(得分:0)

这就是我所做的,它对我来说非常有用: 首先,您需要从列表视图创建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();
    }

答案 5 :(得分:0)

// 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();

快乐编码.....