是否可以在不为每一列创建 class 的情况下从大型竖线分隔文件中获取特定列数据?
Is it possible to get specific column data from a large pipe delimited file without creating a class for every column?
我正在编写一个 C# 程序,它将从一个包含 400 列的竖线分隔文件中获取一些数据。我只需要处理每行中的 6 列。该文件没有 headers,第一行是一个 5 列行,包含文件的一般描述(文件名、批次日期、记录数、总数、报告 ID)。在我创建一个包含 400 个字段的 class 之前,我很好奇这里是否有人对如何处理这个问题有更好的了解。谢谢你的时间。
好吧,您没有提及如何加载文件,但我想它是使用 System.IO 然后在每一行上进行字符串拆分。如果是这样,您不需要提取生成的拆分数组中的每个字段。
假设您只需要两列,第二列和第四列,并且有一个 class 来接受每一行,如下所示:
public class row {
public string field2;
public string field4;
}
然后您将像这样提取数据:
IEnumerable<row> parsed =
File.ReadLines(@"path to file")
.Skip(1)
.Select(line => {
var splitted = line.Split('|');
return new row {
field2 = splitted[1],
field4 = splitted[3]
};
});
您可以使用 Microsoft.VisualBasic.FileIO 参考,然后执行如下操作:
using(var parser = new TextFieldParsser(file))
{
Int32 skipHeader = 0;
parser.SetDelimiters("|");
while (!parser.EndOfData)
{
//Processing row
string[] fields = parser.ReadFields();
Int32 x = 0;
if (skipHeader > 0)
{
foreach (var field in fields)
{
if (x == 0)
{
//SAVE STUFF TO VARIABLE
}
else if (x==4)
{
//SAVE MORE STUFF
}
else if (x == 20)
{
//SAVE LAST STUFF
break;//THIS IS THE LAST COLUMN OF DATA NEEDED SO YOU BREAK
}
x++;
}
//DO SOMETHING WITH ALL THE SAVED STUFF AND CLEAR IT OUT
}
else
{
skipHeader++;
}
}}
我正在编写一个 C# 程序,它将从一个包含 400 列的竖线分隔文件中获取一些数据。我只需要处理每行中的 6 列。该文件没有 headers,第一行是一个 5 列行,包含文件的一般描述(文件名、批次日期、记录数、总数、报告 ID)。在我创建一个包含 400 个字段的 class 之前,我很好奇这里是否有人对如何处理这个问题有更好的了解。谢谢你的时间。
好吧,您没有提及如何加载文件,但我想它是使用 System.IO 然后在每一行上进行字符串拆分。如果是这样,您不需要提取生成的拆分数组中的每个字段。
假设您只需要两列,第二列和第四列,并且有一个 class 来接受每一行,如下所示:
public class row {
public string field2;
public string field4;
}
然后您将像这样提取数据:
IEnumerable<row> parsed =
File.ReadLines(@"path to file")
.Skip(1)
.Select(line => {
var splitted = line.Split('|');
return new row {
field2 = splitted[1],
field4 = splitted[3]
};
});
您可以使用 Microsoft.VisualBasic.FileIO 参考,然后执行如下操作:
using(var parser = new TextFieldParsser(file))
{
Int32 skipHeader = 0;
parser.SetDelimiters("|");
while (!parser.EndOfData)
{
//Processing row
string[] fields = parser.ReadFields();
Int32 x = 0;
if (skipHeader > 0)
{
foreach (var field in fields)
{
if (x == 0)
{
//SAVE STUFF TO VARIABLE
}
else if (x==4)
{
//SAVE MORE STUFF
}
else if (x == 20)
{
//SAVE LAST STUFF
break;//THIS IS THE LAST COLUMN OF DATA NEEDED SO YOU BREAK
}
x++;
}
//DO SOMETHING WITH ALL THE SAVED STUFF AND CLEAR IT OUT
}
else
{
skipHeader++;
}
}}