如何使用不同的整数多次格式化字符串?

时间:2013-11-12 13:21:28

标签: c# integer

所以这是我的问题,基本上我正在阅读一些关键字(在我的情况下是'#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等文件的任何想法?

由于

2 个答案:

答案 0 :(得分:1)

我认为更简单的方法是:

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));
}

在这种情况下,yourPathC:\Users\XXXXX\Desktop\

答案 1 :(得分: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();
}

编辑从你的评论中可以看出,你所谈论的文件并没有以相应的方式命名,在这种情况下它可能更适合与Michaels answer类似的东西

基本上你需要从上面的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);