C# 使用C向CSV文件程序添加头#

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

作为编程初学者,也是第一次在c#中对csv文件执行CRUD。我指的是这个链接:我已经找到了我的源代码,对我的程序很有用。但这并没有让我特别满意。我想从中添加标题。是的,我使用此代码成功地添加了标题

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