【问题标题】:Read CSV file in C# and store in DataTable在 C# 中读取 CSV 文件并存储在 DataTable 中
【发布时间】:2016-10-30 00:35:12
【问题描述】:

我正在使用以下代码读取 csv 文件并存储到 C#。但我的要求是,我想跳过csv 文件中的第一行,因为它不是结构化的,因此将第二行作为列。如何在现有代码中执行此操作。

private static DataTable GetDataTabletFromCSVFile(string csv_file_path)
{    
   DataTable csvData = new DataTable();

    try
    {

    using(TextFieldParser csvReader = new TextFieldParser(csv_file_path))
        {
            csvReader.SetDelimiters(new string[] { ";" });
            csvReader.HasFieldsEnclosedInQuotes = true;
            string[] colFields = csvReader.ReadFields();
            foreach (string column in colFields)
            {
                DataColumn datecolumn = new DataColumn(column);
                datecolumn.AllowDBNull = true;
                csvData.Columns.Add(datecolumn);
            }

            while (!csvReader.EndOfData)
            {
                string[] fieldData = csvReader.ReadFields();
                //Making empty value as null
                for (int i = 0; i < fieldData.Length; i++)
                {
                    if (fieldData[i] == "")
                    {
                        fieldData[i] = null;
                    }
                 }
                     csvData.Rows.Add(fieldData);
             }
        }
   }
   catch (Exception ex)
   {
   }
   return csvData;
}

我的 CSV 文件看起来像

a;;{b;g;t{}
firstname;lastname;age;locaion
peter;vela;28;denver
sasi;kiran;38;colorado
sastri;miro;texas

【问题讨论】:

  • 用您的示例数据尝试了我的答案,它可以工作。但是请注意,您使用逗号作为字段分隔符,而文件在字段之间有分号

标签: c# asp.net .net csv datatable


【解决方案1】:

如果您想让自己的生活变得轻松并准备好花钱。 Flexcel 将使您的生活变得轻松。

这件事将在 2 行代码中完成。

谢谢

【讨论】:

    【解决方案2】:

    这应该有效:

    int rowsToSkip = 1;
    int position = 0;
    while (!csvReader.EndOfData)
    {
        string[] fieldData = csvReader.ReadFields();
        if(position >= rowsToSkip)
        {
    
            //Making empty value as null
            for (int i = 0; i < fieldData.Length; i++)
            {
                if (fieldData[i] == "")
                {
                    fieldData[i] = null;
                }
            }
            csvData.Rows.Add(fieldData);
        }
        position++;
    }
    

    【讨论】:

    • 列呢?,这里文件的第二行是列而不是第一行
    • 不确定我是否理解。您需要跳过第一行并从第二行读取标题吗?我认为如果您可以发布文件的前三行会更容易。
    • 您可以检查位置是否 == 1,即您的标题所在的位置,然后填充数据集列。
    【解决方案3】:

    TextFieldParser 类有一个可以接收流的构造函数。
    所以想法是:在你的文件上打开一个 StreamReader,读取第一行并丢弃它,然后构建 TextFieldParser,打开的 StreamReader 位于你的列名所在的第二行。

    我已经测试过了,它似乎可以工作

    using (StreamReader reader = new StreamReader(csv_file_path))
    {
        // Discard the first line... (add checking here)
        reader.ReadLine();
        using(TextFieldParser csvReader = new TextFieldParser(reader))
        {
           csvReader.SetDelimiters(new string[] { ";" });
           .....
    

    我还根据您的示例数据将分隔符设置为分号而不是逗号。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多