C#DataTable列已经存在问题

时间:2015-12-05 22:12:37

标签: c# csv datatable

我尝试将CS​​V文件导入DataTable,但CSV包含的标题相同。 (例如,对于不同的表单部分,有多个" Date"标题)。为了解决这个问题,我决定创建一个循环,它将遍历标题并根据它们的位置替换重复项或不需要的条目。我已经用dummy条目替换了我的replaceWith数组,但我的实际代码确实具有与replace数组关联的正确大小。

string[] columnNames = null;
        string[] oStreamDataValues = null;
        int[] error = {0,1,2,3,4,7,8,9,10,11,15,21,34,37,57,61,65,68,69,71,75,79,82,83,85,89,93,96,97,99,103,107,110,111,113,117,121,124,125,127,128,129,130,132,182,210,212,213,214,215,216,222,226,239};
        int[] replace = {14,16,17,17,20,23,24,27,28,29,31,32,44,58,59,60,62,63,64,66,67,70,72,73,74,76,77,78,80,81,84,86,87,88,90,91,92,94,95,98,100,101,102,104,105,106,108,109,112,114,115,116,118,119,120,122,123,126,134,136,138,140,142,144,146,148,150,152,154,156,158,160,162,164,166,168,170,172,174,176,178,180,184,186,187,188,190,191,192,194,195,196,198,199,200,202,203,204,206,207,208,209,236,242,243,244};
        string[] replaceWith = {"Replace 1", "Replace 2", "Replace 3"};
        string fix = "ignore_";
        int inc = 00;
        string entry = "";
        while (!oStreamReader.EndOfStream)
        {
            string oStreamRowData = oStreamReader.ReadLine().Trim();
            if (oStreamRowData.Length > 0)
            {
                //oStreamDataValues = Regex.Split(oStreamRowData, ",(?=(?:[^']*'[^']*')*[^']*$)");
                oStreamDataValues = oStreamRowData.Split(',');
                if (rowCount == 0)
                {
                    rowCount = 1;
                    columnNames = oStreamDataValues;

                        for (int i = 0; i < columnNames.Length; i++)
                        {
                            for (int j = 0; j < error.Length; j++)
                            {
                                if (error[j] == i)
                                {
                                    entry = fix + inc++;


                                }
                            }
                            for (int k = 0; k < replace.Length; k++)
                            {

                                if (replace[i] == i)
                                {
                                    int add = 0;
                                    entry = replaceWith[add++];
                                }
                            }


                        DataColumn oDataColumn = new DataColumn(entry, typeof(string));
                        oDataColumn.DefaultValue = string.Empty;
                        oDataTable.Columns.Add(oDataColumn);
                    }
                }
            }

我没有编码专家,所以我的语法/决策制定并不完美。

然而,我得到的错误是名为&#39; ignore_4&#39;已经属于这个DataTable。

我认为循环逻辑中的某些内容不正确。

1 个答案:

答案 0 :(得分:0)

我认为你的循环过于复杂。您只需要在错误数组和替换数组中保留当前位置的索引。

string rep = "replace_";  // base string for replace fields
string fix = "ignore_";   // base string for ignore fields

// For demonstation purpose I have commented out this array. If you 
// want every 'replace' column have its specific name then prepare this
// array with exactly the number of names required by the number of 
// elements in the replace array
//
// string[] replaceWith = {"Replace 1", "Replace 2", "Replace 3"};

int idxErrors = 0;        // Current position in the error array
int idxReplace = 0;       // Current position in the replace array
int fixCounter = 1;
int repCounter = 1;
string entry = "";
for (int i = 0; i < columnNames.Length; i++)
{
    // Is this the index of a column that should be ignored?
    if (idxErrors < error.Length && i == error[idxErrors])
    {
        entry = fix + fixCounter.ToString("D2");
        idxErrors++;
        fixCounter++;
    }
    // Is this the index of a column that should have a different name??
    else if (idxReplace < replace.Length && i == replace[idxReplace])
    {
        entry = rep + repCounter.ToString("D2");
        // entry = replaceWith[repCounter];
        idxReplace++;
        repCounter++;
    }
    else
        entry = columnNames[i];

    // Now create the column
    DataColumn oDataColumn = new DataColumn(entry, typeof(string));
    oDataColumn.DefaultValue = string.Empty;
    oDataTable.Columns.Add(oDataColumn);
}

在这个例子中,对于需要更改名称的列,我也使用了与被忽略列相同的模式。如果要为每个重命名的列指定一个正确的名称,则需要准备一个具有这些专有名称的数组,并且此数组应与replace数组的长度相同。然后使用idxReplace从可能的专有名称数组中获取正确的名称。