0

所以这是我的问题,基本上我正在读取多个数据文件的关键字(在我的情况下为“#Footer”)之后的最后几行,并且只提取相关数据,我能够提取文件的结尾,但是阅读多个时遇到问题,

假设我有一些示例文件,“testfile00”、“testfile21”、“testfile 10”等

请记住,我在任何类型的编程方面都没有特别的经验,我将如何阅读这些文件并从中提取数据?

到目前为止,我有以下代码;

static void Main(string[] args)
{
    try
    {
        for (int i = 0; i < 3; i++)
        {

                string str1 = @"C:\Users\XXXXX\Desktop\testfile";
                string str2 = i.ToString();
                string str3 = ".datafile";

                string final = str1 + str2 + str2 + str3;


                var lines = File.ReadLines(final)
                            .SkipWhile(line => !line.Contains("#Footer"))
                            .Skip(1)
                            .ToList();

                Console.WriteLine(String.Join(Environment.NewLine, lines));


        }
    }
    catch (Exception e)
    {
        Console.WriteLine("The file could not be read:");
        Console.WriteLine(e.Message);
        Console.Read();
    }
}

我知道使用“str2 + str2”是错误的,我得到的结果只会读取文件“testfile00”、“testfile11”和“testfile22”,这就是我不知道如何纠正这个以获得带有 01、12、20 等的文件有什么想法吗?

谢谢

4

2 回答 2

2

我认为更简单的方法是:

foreach (var file in Directory.GetFiles(yourPath, "*.datafile"))
{
    var lines = File.ReadLines(file)
                    .SkipWhile(line => !line.Contains("#Footer"))
                    .Skip(1)
                    .ToList();

    Console.WriteLine(String.Join(Environment.NewLine, lines));
}

yourPath在这种情况下在哪里C:\Users\XXXXX\Desktop\

于 2013-11-12T13:24:29.563 回答
0

您可以使用嵌套循环

try
{
    string str1 = @"C:\Users\XXXXX\Desktop\testfile";
    string str3 = ".datafile";

    for (int i = 0; i < 3; i++)
    {
        for(int j = 0; j< 3; j++){               

            string final = str1 + i+ j + str3;


            var lines = File.ReadLines(final)
                        .SkipWhile(line => !line.Contains("#Footer"))
                        .Skip(1)
                        .ToList();

            Console.WriteLine(String.Join(Environment.NewLine, lines));
        }

    }
}
catch (Exception e)
{
    Console.WriteLine("The file could not be read:");
    Console.WriteLine(e.Message);
    Console.Read();
}

但是,您可能希望在尝试阅读之前确保该文件存在,并且您还可能希望使其更具声明性,因为这通常更易于阅读。(何时掌握语法)。与执行循环相比,人类大脑在阅读/理解顺序的东西方面要好得多

var path = @"C:\Users\XXXXX\Desktop\testfile";
var ext  = ".datafile";
var range = Enumerable.Range(0,3);
var filePaths = 
             from i in range
             from j in range
             let file = path + i + j+ ext
             where File.Exists(file)
             select File.ReadLines(f)
                        .SkipWhile(line => !line.Contains("#Footer"))
                        .Skip(1);
try{
   Console.WriteLine(String.Join(Environment.NewLine,filePaths.SelectMany(f => f));
} catch (Exception e)
{
    Console.WriteLine("The file could not be read:");
    Console.WriteLine(e.Message);
    Console.Read();
}

编辑从您的评论看来,您正在谈论的文件没有以后续的方式命名,在这种情况下,与迈克尔斯回答类似的东西可能更好

本质上,您需要替换上面 LINQ 语句中的前 3 行

      var filePaths = 
             //This will go through all files in the directory but can be narrowed
             //down if needed ie if not all files should be parsed
             from i in Directory.GetFiles(path)
             //You don't need to test if the files exist any more
             select File.ReadLines(f)
                        .SkipWhile(line => !line.Contains("#Footer"))
                        .Skip(1);
于 2013-11-12T13:25:06.053 回答