C# 使用C向CSV文件程序添加头#
作为编程初学者,也是第一次在c#中对csv文件执行CRUD。我指的是这个链接:我已经找到了我的源代码,对我的程序很有用。但这并没有让我特别满意。我想从中添加标题。是的,我使用此代码成功地添加了标题C# 使用C向CSV文件程序添加头#,c#,csv,C#,Csv,作为编程初学者,也是第一次在c#中对csv文件执行CRUD。我指的是这个链接:我已经找到了我的源代码,对我的程序很有用。但这并没有让我特别满意。我想从中添加标题。是的,我使用此代码成功地添加了标题 InitializeComponent(); conDB = new csvfile(); conDB.Path = "E:\\BR_AttendanceDownloadLogs" + DateTime.Today.ToString("yyyyMMdd") + ".csv"; fill
InitializeComponent();
conDB = new csvfile();
conDB.Path = "E:\\BR_AttendanceDownloadLogs" +
DateTime.Today.ToString("yyyyMMdd") + ".csv";
fillCombo();
但在成功添加我的标题后,如下所示:
“员工代码”、“日期”、“时间”、“类型”、“备注”
代码流受标头中此类型字段的影响。注意!我改变格式就像我的标题格式一样。我的函数的其余部分是,读取csv文件中的行会受到我的头的影响。它会返回到不希望出现的错误。希望任何人都能把我解救到我的错误之岛。您可以用更简洁的StreamWriter代码替换所有StreamWriter代码,并用 这些更改将导致更干净的插入方法
String newFileName = "E:\\BR_AttendanceDownloadLogs" +
DateTime.Today.ToString("yyyyMMdd") + ".csv";
string clientHeader = "\"EmployeeCode\"" + ",\"" + "Date" + "\",\""+
"Time" + "\",\"" + "Type" + "\",\"" + "Remarks" + "\"" +
Environment.NewLine;
File.WriteAllText(newFileName, clientHeader);
conDB.InsertEntrie(txtidno.Text, DatePicker.Text, TimePicker.Text,
cmbtype.Text, txtremarks.Text);
//txtID.Text = Convert.ToString(conDB.Entries()-1);
txtvalue = Convert.ToString(conDB.Entries() - 1);
fillCombo();
txtidno.Text = "";
DatePicker.Text = "";
TimePicker.Text = "";
cmbtype.Text = "";
txtremarks.Text = "";
当然,button1 click应该只写一次标题,而不是每次单击。为了避免这种情况发生,您需要在写入头文件之前检查文件是否存在
public bool InsertEntry(string idnumber, string date, string time, string type, string remarks)
{
try
{
string line = $"\"{idnumber}\",\"{date}\",\"{time}\",\"{type}\",\"{remarks}\"{Environment.NewLine}";
File.AppendAllText(data_path, line);
return true;
}
catch (Exception ee)
{
string temp = ee.Message;
return false;
}
}
我在史蒂夫的帮助下解决了这个问题。 首先,我将此代码添加到表单中
String newFileName = @"E:\BR_AttendanceDownloadLogs" +
DateTime.Today.ToString("yyyyMMdd") + ".csv");
if(!File.Exists(newFileName))
{
string clientHeader = $"\"EmployeeCode\",\"Date\",\"Time\",\"Type\",\"Remarks\"{Environment.NewLine}";
File.WriteAllText(newFileName, clientHeader);
}
然后我将这个函数添加到我的另一个类中,以添加来自用户输入的条目。感谢史蒂夫
InitializeComponent();
conDB = new csvfile();
conDB.Path = "E:\\BR_AttendanceDownloadLogs" +
DateTime.Today.ToString("yyyyMMdd") + ".csv";
String newFileName = "E:\\BR_AttendanceDownloadLogs" +
DateTime.Today.ToString("yyyyMMdd") + ".csv";
if (!File.Exists(newFileName))
{
string clientHeader = "\"EmployeeCode\"" + ",\"" + "Date" + "\",\"" +
"Time" + "\",\"" + "Type" + "\",\"" + "Remarks" + "\"" +
Environment.NewLine;
File.WriteAllText(newFileName, clientHeader);
}
fillCombo();
然后我在button click事件中将此代码添加到我的表单中
public bool InsertEntrie(string idnumber, string date, string time, string
type, string remarks)
{
CreateConfigFile();
try
{
string line = $"\"{idnumber}\",\"{date}\",\"{time}\",\"
{type}\",\"{remarks}\"{Environment.NewLine}";
File.AppendAllText(data_path, line);
return true;
}
catch (Exception ee)
{
string temp = ee.Message;
return false;
}
}
添加了一个检查,以排除在文件存在时写入标头。WriteAllText(新文件名,clientHeader);=错误说明:System.IO.DirectoryNotFoundException:“找不到路径“E:\BR\u AttendanceDownloadLogs\20170608.csv”的一部分。这很清楚。没有像E:\BR\u AttendanceDownloadLogs这样的路径如果驱动器E存在,我们可以添加(@“E:\BR\u AttendanceDownloadLogs”);或者,如果您想要一个名为E:\BR\u AttendanceDownloadLogs20170608.csv的文件,则只需删除路径。组合并使用原始代码。我的意思是字符串newFileName=“E:\\BR\u AttendanceDownloadLogs”+DateTime.ToString(“yyyyMMdd”)+“.csv”;然后检查文件是否存在。在处理文本文件时,没有诸如CRUD之类的东西。你不能搜索,不能更新,不能*删除。仅读取整个文件、在末尾追加行或重写整个文件。如果您想在其他任何地方添加一行,则必须复制原始文本。在您的情况下,读取内存中的所有内容,然后首先写出标题,然后写出剩余的contentNo。有。我尝试上面链接中的代码。它起作用了。但是在我添加了头之后,传递值的流程被破坏了,我很难调试如何进行。你所说的CRUD与首字母缩略词的真正含义无关。CRUD意味着处理单个记录。您的代码重写了整个文件。您无法更新单行,因为(a)除非所有记录的字节长度完全相同,否则您甚至找不到行偏移量;(b)出于同样的原因,您将覆盖其他行。您不能插入任何内容,因为您必须复制文件的其余部分。您只能在文件末尾追加文本。来吧,先试试。
private void button1_Click(object sender, EventArgs e)
{
conDB.InsertEntrie(txtidno.Text, DatePicker.Text, TimePicker.Text,
cmbtype.Text, txtremarks.Text);
txtvalue = Convert.ToString(conDB.Entries() - 1);
}