C# 不想在循环浏览第一个文件时添加标题行
我想做什么 基本上,我会在我所有的文件夹中循环,以捕捉是否有.txt文档。 当我循环完成此操作时,我希望将此文档中的标题和行添加到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
数据表
。每个文件中的“我的列”始终相同
我目前使用的代码
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 */
}