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

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 に答える