C#导入到数据表时跳过csv coulmns

C#导入到数据表时跳过csv coulmns,c#,datatable,C#,Datatable,在下面提到的代码中,我试图将一个大型CSV文件导入datatable,并添加第一行作为标题。导入时,如果某个标题包含某些文本字符串,则跳过该标题。 如果缺少标题,我想跳过行值。请帮助。 这是我的密码 private static DataTable GetDataTabletFromCSVFile(string csv_file_path) { DataTable csvData = new DataTable(); try {

在下面提到的代码中,我试图将一个大型CSV文件导入datatable,并添加第一行作为标题。导入时,如果某个标题包含某些文本字符串,则跳过该标题。 如果缺少标题,我想跳过行值。请帮助。 这是我的密码

 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)
                {
                    if (column.Contains("code"))
                    {
//here i am skipping a column if it contains the string
                        continue;
                    }

                    else if (column.Contains("Q"))
                    {
                        continue;
                    }

                    else if (column.Contains("M"))
                    {
                        continue;
                    }

                    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)
        {
            Console.WriteLine(ex.Message.ToString());
        }
        return csvData;
    }
私有静态数据表GetDataTabletFromCSVFile(字符串csv\u文件\u路径)
{
DataTable csvData=新DataTable();
尝试
{
使用(TextFieldParser csvReader=新的TextFieldParser(csv_文件_路径))
{
SetDelimiters(新字符串[]{“,”});
csvReader.HasFieldsEnclosedInQuotes=true;
字符串[]colFields=csvReader.ReadFields();
foreach(colFields中的字符串列)
{
if(列包含(“代码”))
{
//这里我跳过一个列,如果它包含字符串
继续;
}
else if(列包含(“Q”))
{
继续;
}
else if(列包含(“M”))
{
继续;
}
DataColumn datecolumn=新的DataColumn(列);
datecolumn.AllowDBNull=true;
csvData.Columns.Add(datecolumn);
}
而(!csvReader.EndOfData)
{
字符串[]fieldData=csvReader.ReadFields();
//将空值设为null
for(int i=0;i
一个更简单的解决方案是将
.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);
            }
        }

        // get the names of the columns to remove
        var columnNamesToRemove = csvData.Columns
            .OfType<DataColumn>()
            .Where(
                c => c.Name.Contains("code") || 
                c => c.Name.Contains("Q") || 
                c => c.Name.Contains("M") 
            )
            .Select(c => c.Name);

        // remove the columns from the data table
        foreach(var name in columnNamesToRemove)
        {
            csvData.Columns.Remove(name);
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message.ToString());
    }
    return csvData;
}
私有静态数据表GetDataTabletFromCSVFile(字符串csv\u文件\u路径)
{
DataTable csvData=新DataTable();
尝试
{
使用(TextFieldParser csvReader=新的TextFieldParser(csv_文件_路径))
{
SetDelimiters(新字符串[]{“,”});
csvReader.HasFieldsEnclosedInQuotes=true;
字符串[]colFields=csvReader.ReadFields();
foreach(colFields中的字符串列)
{
DataColumn datecolumn=新的DataColumn(列);
datecolumn.AllowDBNull=true;
csvData.Columns.Add(datecolumn);
}
而(!csvReader.EndOfData)
{
字符串[]fieldData=csvReader.ReadFields();
//将空值设为null
for(int i=0;ic.Name.Contains(“代码”)||
c=>c.Name.Contains(“Q”)||
c=>c.Name.Contains(“M”)
)
.选择(c=>c.Name);
//从数据表中删除列
foreach(columnNamesToRemove中的变量名)
{
csvData.Columns.Remove(名称);
}
}
捕获(例外情况除外)
{
Console.WriteLine(例如Message.ToString());
}
返回csvData;
}

一个更简单的解决方案是将
.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);
            }
        }

        // get the names of the columns to remove
        var columnNamesToRemove = csvData.Columns
            .OfType<DataColumn>()
            .Where(
                c => c.Name.Contains("code") || 
                c => c.Name.Contains("Q") || 
                c => c.Name.Contains("M") 
            )
            .Select(c => c.Name);

        // remove the columns from the data table
        foreach(var name in columnNamesToRemove)
        {
            csvData.Columns.Remove(name);
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message.ToString());
    }
    return csvData;
}
私有静态数据表GetDataTabletFromCSVFile(字符串csv\u文件\u路径)
{
DataTable csvData=新DataTable();
尝试
{
使用(TextFieldParser csvReader=新的TextFieldParser(csv_文件_路径))
{
SetDelimiters(新字符串[]{“,”});
csvReader.HasFieldsEnclosedInQuotes=true;
字符串[]colFields=csvReader.ReadFields();
foreach(colFields中的字符串列)
{
DataColumn datecolumn=新的DataColumn(列);
datecolumn.AllowDBNull=true;
csvData.Columns.Add(datecolumn);
}
而(!csvReader.EndOfData)
{
字符串[]fieldData=csvReader.ReadFields();
//将空值设为null
for(int i=0;ic.Name.Contains(“代码”)||
c=>c.Name.Contains(“Q”)||
c=>c.Name.Contains(“M”)
)
.选择(c=>c.Name);
//从数据表中删除列
foreach(columnNamesToRemove中的变量名)
{
csvData.Columns.Remove(名称);
}
}
捕获(例外情况除外)
{
Console.WriteLine(例如Message.ToString());
}
返回csvData;
}

您需要存储跳过的列,例如:

List<int> skippedColumnOrdinals = new List<int>();
string[] skipWhenContains = { "code", "Q", "M" };

for (int index = 0; index < colFields.Length; index++)
{
    string column = colFields[index];
    bool skipColumn = skipWhenContains.Any(column.Contains);
    if (skipColumn)
    {
        skippedColumnOrdinals.Add(index);
        continue;
    }

    DataColumn datecolumn = new DataColumn(column) { AllowDBNull = true };
    csvData.Columns.Add(datecolumn);
}

while (!csvReader.EndOfData)
{
    string[] fieldData = csvReader.ReadFields()
        .Where((field, index) => !skippedColumnOrdinals.Contains(index))
        .Select(field => field == "" ? null : field)
        .ToArray();
    csvData.Rows.Add(fieldData);
}
List skippedColumnOrdinals=新列表(