簡體   English   中英

C#導入數據表時跳過csv coulmns

[英]C# skip csv coulmns while importing to data table

在下面提到的代碼中,我試圖將一個大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)
                {
                    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;
    }

您需要存儲跳過的列,例如,以這種方式:

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

一個更簡單的解決方案是將.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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM