是否可以在不为每一列创建 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++;
    }
}}