[英]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.