Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 不想在循环浏览第一个文件时添加标题行_C#_Foreach_Datatable_Textfieldparser - Fatal编程技术网

C# 不想在循环浏览第一个文件时添加标题行

C# 不想在循环浏览第一个文件时添加标题行,c#,foreach,datatable,textfieldparser,C#,Foreach,Datatable,Textfieldparser,我想做什么 基本上,我会在我所有的文件夹中循环,以捕捉是否有.txt文档。 当我循环完成此操作时,我希望将此文档中的标题和行添加到数据表。每个文件中的“我的列”始终相同 我目前使用的代码 DataTable csvData = new DataTable(); string[] fullpath = Directory.GetFiles(@"D:\Stack", "*.txt", System.IO.SearchOption.AllDirectories); fore

我想做什么

基本上,我会在我所有的文件夹中循环,以捕捉是否有.txt文档。 当我循环完成此操作时,我希望将此文档中的标题和行添加到
数据表
。每个文件中的“我的列”始终相同

我目前使用的代码

DataTable csvData = new DataTable();

string[] fullpath = Directory.GetFiles(@"D:\Stack", "*.txt", System.IO.SearchOption.AllDirectories);

            foreach(string s in fullpath)
            {

                DataTable eachfile = new DataTable();

            using (TextFieldParser csvReader = new TextFieldParser(s))
            {


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

                    eachfile.Columns.Add("SalesNo");
                    eachfile.Columns.Add("Date");


                    while (!csvReader.EndOfData)
                    {

                        csvReader.SetDelimiters(new string[] { "," });

                        string[] fieldData = csvReader.ReadFields();
                        //Making empty value as null
                        for (int i = 0; i < fieldData.Length; i++)
                        {
                            if (fieldData[i] == "")
                            {
                                fieldData[i] = null;
                            }
                        }

                        Match conum = Regex.Match(s, @"SalesNo\d+");
                        Match cycle = Regex.Match(s, @"Date\d{8}");


                        DataRow row = eachfile.NewRow();

                        //Alternativ
                        //row["FirstName"] = fieldData[0];
                        row[0] = fieldData[0];
                        row[1] = fieldData[1];
                        row[2] = conum;
                        row[3] = cycle;

                        eachfile.Rows.Add(row);

                        csvData = eachfile.Copy();
                    }



                }
            }
        }
完成此操作并且插入了第一个文件中的数据后,我不想再次为下一个文件添加标题行,因为它将由于名称重复而失败。但仅将数据添加到已存在的csvData(而不覆盖先前添加的数据)

我认为我能做什么?

我想我需要数一数它是否是第一个文件,然后像这样做 在这里我计算完整路径的数量,如果是1,我将通过标题,否则我将进入我的else,在那里我首先读取行,这样我就不会得到第一行了

 if (fullpath.Count() == 1)
                    {

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

                        csvData.Columns.Add("CoNum");
                        csvData.Columns.Add("CycleDate");


                        while (!csvReader.EndOfData)
                        {

                            csvReader.SetDelimiters(new string[] { "," });

                            string[] fieldData = csvReader.ReadFields();
                            //Making empty value as null
                            for (int i = 0; i < fieldData.Length; i++)
                            {
                                if (fieldData[i] == "")
                                {
                                    fieldData[i] = null;
                                }
                            }

                            Match conum = Regex.Match(s, @"CoNum\d+");
                            Match cycle = Regex.Match(s, @"CycleDate\d{8}");


                            DataRow row = csvData.NewRow();

                            //Alternativ
                            //row["FirstName"] = fieldData[0];
                            row[0] = fieldData[0];
                            row[1] = fieldData[1];
                            row[2] = conum;
                            row[3] = cycle;

                            csvData.Rows.Add(row);
                        }
                    }
                    else
                    {
                        csvReader.ReadLine();
                        while (!csvReader.EndOfData)
                        {

                            csvReader.SetDelimiters(new string[] { "," });

                            string[] fieldData = csvReader.ReadFields();
                            //Making empty value as null
                            for (int i = 0; i < fieldData.Length; i++)
                            {
                                if (fieldData[i] == "")
                                {
                                    fieldData[i] = null;
                                }
                            }

                            Match conum = Regex.Match(s, @"CoNum\d+");
                            Match cycle = Regex.Match(s, @"CycleDate\d{8}");


                            DataRow row = csvData.NewRow();

                            //Alternativ
                            //row["FirstName"] = fieldData[0];
                            row[0] = fieldData[0];
                            row[1] = fieldData[1];
                            row[2] = conum;
                            row[3] = cycle;

                            csvData.Rows.Add(row);
                        }


                    }
if(fullpath.Count()==1)
{
SetDelimiters(新字符串[]{;“});
csvReader.HasFieldsEnclosedInQuotes=false;
字符串[]colFields=csvReader.ReadFields();
foreach(colFields中的字符串列)
{
DataColumn datecolumn=新的DataColumn(列);
datecolumn.AllowDBNull=true;
csvData.Columns.Add(datecolumn);
}
csvData.Columns.Add(“CoNum”);
csvData.Columns.Add(“CycleDate”);
而(!csvReader.EndOfData)
{
SetDelimiters(新字符串[]{“,”});
字符串[]fieldData=csvReader.ReadFields();
//将空值设为null
for(int i=0;i

提前谢谢

您的问题似乎与检测到
foreach
循环的第一次迭代有关。所有其他构建块,如添加列和添加数据行,看起来都很好,可以正常工作

有很多选择。一种方法是对
循环使用
,并且仅当循环计数器有其起始值时才添加列。一种是添加一个标志,确保只在第一次迭代中添加列:

var isfirstfile = true;
foreach(var file in files)
{
    if(isfirstfile)
    {
        /* add the columns */


        isfirstfile = false;
    }
    else 
    {
        /* skip the first row of the current input file */
    }
    /* add the data rows */

}

当然,这假设所有文件都有相同数量和类型的列,顺序相同。

看起来您只需要重新排列一下:新的数据表不在循环中(即,只使用
csvData
并删除
eachFile
,只为第一个文件添加列(使用文件计数器或切换标志),你完成了,还是我遗漏了什么,比如所有文件的标题不一样,或者顺序不同?@dlatikay我用计数器也在想同样的问题-我只是用我认为需要的更新了我的问题。我不需要每个文件的数据表。这应该删除。我只需要csvDataDataTable@MethodMan我不知道我为什么应该使用Addrange吗?这对我有什么好处?我的datatable中已经有了我的列。这正是我所需要的。当然,我可以设置一个变量。我想计算数组的索引,但不知道如何计算。我也尝试了for循环,但没有完全正确。这更容易。谢谢!
var isfirstfile = true;
foreach(var file in files)
{
    if(isfirstfile)
    {
        /* add the columns */


        isfirstfile = false;
    }
    else 
    {
        /* skip the first row of the current input file */
    }
    /* add the data rows */

}