如何使用 C# 删除 .CSV 文件中的第一个字段和该字段的所有值

how to delete first field and all values of this field in .CSV file using C#

我想加载 .csv 文件,然后导入到 SQl 数据库。但在此之前,我想删除第一个字段(在 header 中)以及该字段的所有值。

下面是我的 .csv 文件的示例:

> TableId|PERIODE|DATEBALANCEASOF|ACCCODE|CUSTNAME|CUSTGROUP|
> TB_001|201501|2015-01-01|11-0001|DYNAMIC EXPRESS|11|
> TB_001|201501|2015-01-01|11-0002|DYNAMIC EXPRESS|12|
> TB_001|201501|2015-01-01|11-0003|DYNAMIC EXPRESS|13|
> TB_001|201501|2015-01-01|11-0004|DYNAMIC EXPRESS|14|

在导入 .csv 文件之前,我需要如下所示的 .csv 文件:

PERIODE|DATEBALANCEASOF|ACCCODE|CUSTNAME|CUSTGROUP|
201501|2015-01-01|11-0001|DYNAMIC EXPRESS|11|
201501|2015-01-01|11-0002|DYNAMIC EXPRESS|12|
201501|2015-01-01|11-0003|DYNAMIC EXPRESS|13|
201501|2015-01-01|11-0004|DYNAMIC EXPRESS|14|

下面是我的代码:

    public void readCSVManual(string pathLocalSuccess, string pathHistory, string modul)
    {
        try
        {
            SqlConnection con = new SqlConnection();
            con.ConnectionString = @"server=" + serverDB + "; database=" + DB + "; Trusted_Connection=" + trustedConnection + "; user=" + UserDB + "; password=" + PassDB + "";
            string[] files = Directory.GetFiles(pathLocalSuccess);

            if (files == null)
            {
                MessageBox.Show("Files not found");
            }

            foreach (string file in files)
            {
                FileInfo fileInf = new FileInfo(file);
                string filename = fileInf.Name;
                StreamReader reader = new StreamReader(file);


                string line = reader.ReadLine();
                string[] value = line.Split('|');

                var list = new List<string>(value);
                list.RemoveAt(0);
                value = list.ToArray();

                //string[] v = string(nValue.ToArray());



                DataTable dt = new DataTable();
                DataRow row;
                foreach (string dc in value)
                {
                    dt.Columns.Add(new DataColumn(dc));
                }

                while (!reader.EndOfStream)
                {
                    value = reader.ReadLine().Split('|');
                    if (value.Length == dt.Columns.Count)
                    {
                        row = dt.NewRow();
                        row.ItemArray = value;
                        dt.Rows.Add(row);
                    }
                }

                SqlBulkCopy bc = new SqlBulkCopy(con.ConnectionString, SqlBulkCopyOptions.TableLock);

                bc.DestinationTableName = "ACC_004";


                bc.BatchSize = dt.Rows.Count;
                bc.WriteToServer(dt);
                bc.Close();
                con.Close();
                reader.Close();
            }
        }

        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }

请帮我解决这个问题..

感谢所有回答我问题的人, 实际上我已经通过在我的代码中进行一些编辑来解决这个问题 下面是我的代码,对我有用:

public void readCSVAutomatic(string pathLocalSuccess, string pathHistory, string pathLogFolderSuccess, string pathErrorLog, string modul)
    {
        try
        {
            string[] files = Directory.GetFiles(pathLocalSuccess);

            foreach (string file in files)
            {
                FileInfo fileInf = new FileInfo(file);
                string filename = fileInf.Name;
                StreamReader reader = new StreamReader(file);

                string line = reader.ReadLine();
                string[] value = line.Split('|');

                DataTable dt = new DataTable();
                DataRow row;
                foreach (string dc in value)
                {
                    dt.Columns.Add(new DataColumn(dc));
                }

                while (!reader.EndOfStream)
                {
                    //value = value.
                    value = reader.ReadLine().Split('|');
                    if (value.Length == dt.Columns.Count)
                    {
                        row = dt.NewRow();
                        row.ItemArray = value;
                        dt.Rows.Add(row);
                    }
                }

                string xTableName = dt.Rows[0].ItemArray[0].ToString();
                string xPeriode = dt.Rows[0].ItemArray[1].ToString();
                dt.Columns.RemoveAt(0);

                SqlConnection con = new SqlConnection();
                con.ConnectionString = @"Data Source=" + serverDB + "; Initial Catalog=" + DB + "; Trusted_Connection=" + trustedConnection + "; user=" + UserDB + "; password=" + PassDB + "";

                con.Open();

                SqlCommand com = con.CreateCommand();
                string strDelete = "DELETE FROM " + xTableName + " WHERE PERIODE='" + xPeriode + "'";
                com.CommandText = strDelete;
                com.Connection = con;
                com.ExecuteNonQuery();

                SqlBulkCopy bc = new SqlBulkCopy(con.ConnectionString, SqlBulkCopyOptions.TableLock);

                bc.DestinationTableName = xTableName;

                bc.BatchSize = dt.Rows.Count;
                bc.WriteToServer(dt);
                bc.Close();
                con.Close();
                reader.Close();

                moveFileAfterImported(pathLocalSuccess, filename, pathHistory);

                createLogCSVSuccessImported(pathLogFolderSuccess, "File Imported","Message");
            }
        }

        catch(Exception ex)
        {
            createErrorLogImportCSV(pathErrorLog, "ErrorImportCSV", ex.ToString());
        }
    }

这似乎适合我:

首先从阅读所有文件开始:

    var datatables =
        Directory
            .GetFiles(pathLocalSuccess)
            .Select(file => File.ReadAllLines(file).Select(x => x.Split('|')).ToArray())
            .Select(lines => new
            {
                headers = lines[0].Skip(1).ToArray(),
                lines = lines.Skip(1).Select(l => l.Skip(1).ToArray()).ToArray(),
            })
            .Select(x =>
            {
                var dt = new DataTable();
                foreach (var dc in x.headers)
                {
                    dt.Columns.Add(new DataColumn(dc));
                }
                foreach (var line in x.lines.Skip(1).Where(y => y.Length == x.headers.Length))
                {
                    var row = dt.NewRow();
                    row.ItemArray = line;
                    dt.Rows.Add(row);
                }
                return dt;
            })
            .ToArray();

那么加载所有数据就是一件简单的事情。此代码仅打开一次连接。应该挺快的。

   if (!datatables.Any())
   {
       MessageBox.Show("Files not found");
   }
   else
   {
        using (var con = new SqlConnection())
        {
            con.ConnectionString = @"server=" + serverDB + "; database=" + DB + "; Trusted_Connection=" + trustedConnection + "; user=" + UserDB + "; password=" + PassDB + "";
            foreach (var dt in datatables)
            {
                var bc = new SqlBulkCopy(con.ConnectionString, SqlBulkCopyOptions.TableLock);
                bc.DestinationTableName = "ACC_004";
                bc.BatchSize = dt.Rows.Count;
                bc.WriteToServer(dt);
                bc.Close();
            }
            con.Close();
        }
    }

跳过第一个字段的重要部分在这段代码中找到:

            .Select(lines => new
            {
                headers = lines[0].Skip(1).ToArray(),
                lines = lines.Skip(1).Select(l => l.Skip(1).ToArray()).ToArray(),
            })