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

dtcbnfnu  于 2023-02-27  发布在  C#
关注(0)|答案(9)|浏览(364)

下面的代码写入数据,运行良好,但我想在.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); 
}
tp5buhyn

tp5buhyn1#

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

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

这样,头行只在第一次创建文件时写入。
尽管提供一个列表详细视图可能会更好,它允许您查看所有客户机、添加和删除客户机、选择一个客户机以编辑详细信息,以及保存所有客户机的完整文件。

00jrzges

00jrzges2#

在我看来,您希望每次单击按钮时都添加一个新客户端。
如果是这样的话,那么它当前不起作用的原因是文件正在被行清除

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的命令),然后在应用程序退出时关闭编写器,这样就可以很好地保证在应用程序打开时文件不会被篡改。
您可能希望这样做,因为该代码中存在争用条件-在您检查文件是否存在之后,在您写入文件之前,用户可能会删除它。保持文件打开有助于避免这种情况,但您可能希望也可能不希望这样做。

gwbalxhn

gwbalxhn3#

这里潜在的问题似乎是你从哪里获取数据来附加到你的CSV文件中。你的示例代码看起来像是从页面上的文本框中获取不同的数据片段,所以如果你想要多个客户端,他们都要在屏幕上的文本框中显示他们的数据吗?我的直觉可能不是。
在我看来,您应该使用某种类来处理这些客户端数据(可能持久化在数据库中),然后在该类中实现一个类似void AppendToCSV(字符串文件名)的方法,该方法将 that 客户端数据附加到CSV文件中,然后您可以循环遍历客户端对象,依次附加每个对象。
您如何生成/存储客户端对象(相对于屏幕上的文本框)取决于您的应用试图实现的目标。

guykilcj

guykilcj4#

我知道这个问题已经得到了回答,但是我还是创建了一个订阅者的日志。这个日志使用反射来获取对象的属性和值。希望这对将来的一些人有所帮助。

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

rkue9o1l5#

以下是我所做的,它对我非常有效:首先你需要从你的列表视图中创建数据表,或者只是从文本框中放入数据:

`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();
    }
jtw3ybtb

jtw3ybtb6#

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

快乐编码.....
c#csv

snz8szmq

snz8szmq7#

使用CsvHelper;
公共void写入数据到Csv(MsgEnvironmentData[]数据,字符串csv路径){

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

}

mhd8tkvw

mhd8tkvw8#

Jeramy的答案写在最后一个单元格的内容,并从他们的水平行在csv文件中。我混合和匹配他的解决方案与答案给出here。我知道这个问题被问了很久以前,但对于那些谁做研究,我张贴在这里的答案。

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

lyr7nygr9#

我使用这段简单的代码将数据附加到现有的CSV文件中:

string[] data = { "John", "Doe", "25" };
        string csvFilePath = "example.csv";

        // Open the file for writing
        using (StreamWriter writer = File.AppendText(csvFilePath))
        {
            // Write the data row
            writer.WriteLine(string.Join(",", data));
        }

相关问题