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