在C#中读取CSV文件并存储在DataTable中

问题描述 投票:0回答:4

我正在使用以下代码读取

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
4个回答
1
投票

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

我已经测试过,似乎有效

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[] { ";" });
       .....

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


0
投票

这应该有效:

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

0
投票

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

这件事只需两行代码即可完成。

谢谢


0
投票
string[] Lines = File.ReadAllLines(this.INPUTTFILE);
string[] Fields;
for (int i = 1; i < Lines.GetLength(0); i++)
{
    DataRow Row = Dt_Input_With_ColoumName.NewRow();
    Fields = Lines[i].Split(new char[] { ',' });
    for (int f = 0; f < Dt_Input_With_ColoumName.Columns.Count; f++)
    {
        Row[f] = Fields[f];
    }
    Dt_Input_With_ColoumName.Rows.Add(Row);
}
© www.soinside.com 2019 - 2024. All rights reserved.