【问题标题】:Reading a csv file from a specific header name in C#从 C# 中的特定标题名称读取 csv 文件
【发布时间】:2018-04-28 12:07:40
【问题描述】:

我想读取一个 csv 文件,其中标题行从特定列名开始,即“名称”

CSV 文件格式如下所示:

v3,vf,gf--Not a Header row 1
v1,c,z1,e--Not a Hera  row 2
name,q1,q2,q3- Header Row- row 3-because name is here
a,0,1,2-Data

我想读取“name”列存在的位置 - 所以我想跳过前 2 行,但在“name”之前我们不知道会出现多少行,它可能是 2 或 3 或 n

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    逐行阅读,然后扔掉这些行,直到到达所需的标题行。然后,解析剩余的行。

    IEnumerable<string[]> ReadDataLines(string csv) {   
        using(var reader = new StringReader(csv))
        using(var parser = new Microsoft.VisualBasic.FileIO.TextFieldParser(reader)) {
            parser.TextFieldType = Microsoft.VisualBasic.FileIO.FieldType.Delimited;
            parser.SetDelimiters(",");
    
            // Until we find the header row, just throw away all the rows
            while(!parser.EndOfData) {
                var line = parser.ReadLine();
                if(line != null && line.TrimStart().StartsWith("name")) {
                    break;
                }
            }       
            // The rest of the input is data rows
            while(!parser.EndOfData) {
                yield return parser.ReadFields();
            }       
        }
    }
    

    在这里,我使用 Microsoft.VisualBasic.FileIO.TextFieldParser 来解析 CSV(请参阅 Reading CSV files using C#)。您当然可以使用任何您想要解析 CSV 的技术,可以使用相同的通用方法。

    【讨论】:

    • 感谢重播,请给我编译代码,我是 C# 新手,无法使用上述代码
    【解决方案2】:
    con = new SqlConnection(strcon);
    
    string[] arrFileName;
    
    if (files != null && files.Length > 0)
    {
        arrFileName = new string[files.Length];
        con.Open();
    
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@FileName", "");
    
        int Result = cmd.ExecuteNonQuery();
        cmd.Dispose();
        con.Close();
    
        for (int i = 0; i < files.Length; i++)
        {
            string FileName = string.Empty;
            string filepath = files[i];
    
            FileName = filepath.Split('\\').Last();
    
            ///////////Logic For Import File
            using (StreamReader sr = new StreamReader(filepath))
            {
                string line = sr.ReadLine();
    
                string[] value = line.Split(',');
                DataTable dt = new DataTable();
                DataRow row;
    
                foreach (string dc in value)
                {
                    dt.Columns.Add(new DataColumn(dc));
                }
    
                dt.Columns.Add(new DataColumn("FileName"));
                dt.Columns.Add(new DataColumn("Date"));
    
                while (!sr.EndOfStream)
                {
                    value = sr.ReadLine().Split(',');
    
                    row = dt.NewRow();
                    row.ItemArray = value;
                    row[9] = FileName;
                    row[10] = DateTime.Now;
    
                    dt.Rows.Add(row);
                }
    
                SqlBulkCopy bc = new SqlBulkCopy(con.ConnectionString, SqlBulkCopyOptions.TableLock);
                bc.DestinationTableName = "InvoiceData";
                bc.BatchSize = dt.Rows.Count;
    
                con.Open();
                bc.BulkCopyTimeout = 2000;
                bc.WriteToServer(dt);
                bc.Close();
                con.Close();
            }
    
            //////Logic For Delete File From Folder if you want
            File.Delete(filepath);
        }
    
        files = new string[] { };
        txtFilePath.Text = null;
    
        MessageBox.Show("Files Imported Successfully!!");
    }
    else
    {
        MessageBox.Show("Please Browse The File!!");
    }
    

    【讨论】:

    • 请使用库-----使用 ClosedXML.Excel;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 2014-07-25
    相关资源
    最近更新 更多