演習 - ファイルに対する読み取りと書き込みを行う

完了

.NET の File クラスを使用して、ファイルにデータを書き込んだり、ファイルからデータを読み取ったりすることもできます。

あなたは、Tailwind Traders 用の .NET の傑作をほぼ作成し終えました。 これまでのところ、コードによって、ディレクトリが読み取られ、すべての .json ファイルが検索され、totals.txt ファイルが作成されています。

この演習では、.json ファイルを読み取り、店舗の合計を加算し、総計を totals.txt ファイルに書き込むことで、プロジェクトを完了させます。

System.Text.Json をプロジェクトに追加する

  1. ターミナルを使用し、Json.NET をプロジェクトに追加します。

    dotnet add package System.Text.Json
    

売上データの準備

  1. Program.cs の先頭に using Newtonsoft.Json を追加します。

    using System.Text.Json;
    
  2. Program.csFindFiles メソッドの直下に、sales.json データをモデル化する新しい record を追加します。

    record SalesData (double Total);
    

売上合計を計算するメソッドを作成する

  1. 売上合計を計算する新しい関数を、Program.cs の前の手順で追加した record 行の直前に作成します。 このメソッドで、反復処理が可能なファイルのパスの IEnumerable<string> を受け取る必要があります。

    double CalculateSalesTotal(IEnumerable<string> salesFiles)
    {
        double salesTotal = 0;
    
        // READ FILES LOOP
    
        return salesTotal;
    }
    
  2. そのメソッド内で、// READ FILES LOOP を、salesFiles を反復処理し、ファイルを読み取り、その内容を JSON として解析し、ファイルからの total 値で salesTotal 変数をインクリメントするループに置き換えます。

    double CalculateSalesTotal(IEnumerable<string> salesFiles)
    {
        double salesTotal = 0;
    
        // Loop over each file path in salesFiles
        foreach (var file in salesFiles)
        {      
            // Read the contents of the file
            string salesJson = File.ReadAllText(file);
    
            // Parse the contents as JSON
            SalesData? data = JsonSerializer.Deserialize<SalesData?>(salesJson);
    
            // Add the amount found in the Total field to the salesTotal variable
            salesTotal += data?.Total ?? 0;
        }
    
        return salesTotal;
    }
    

CalculateSalesTotals メソッドを呼び出す

  1. Program.cs ファイルで、File.WriteAllText 呼び出しのすぐ上にある CalculateSalesTotal 関数に呼び出しを追加します。

    var currentDirectory = Directory.GetCurrentDirectory();
    var storesDir = Path.Combine(currentDirectory, "stores");
    
    var salesTotalDir = Path.Combine(currentDirectory, "salesTotalDir");
    Directory.CreateDirectory(salesTotalDir);
    
    var salesFiles = FindFiles(storesDir);
    
    var salesTotal = CalculateSalesTotal(salesFiles); // Add this line of code
    
    File.WriteAllText(Path.Combine(salesTotalDir, "totals.txt"), String.Empty);
    

totals.txt ファイルに合計を書き込む

  1. Program.cs ファイルで、File.WriteAllText ブロックを変更して、salesTotal 変数の値を totals.txt ファイルに書き込みます。 ついでに、ファイル内で何も上書きされないように、File.WriteAllText の呼び出しを File.AppendAllText に変更します。

    var currentDirectory = Directory.GetCurrentDirectory();            
    var storesDir = Path.Combine(currentDirectory, "stores");
    
    var salesTotalDir = Path.Combine(currentDirectory, "salesTotalDir");
    Directory.CreateDirectory(salesTotalDir);            
    
    var salesFiles = FindFiles(storesDir);
    
    var salesTotal = CalculateSalesTotal(salesFiles);
    
    File.AppendAllText(Path.Combine(salesTotalDir, "totals.txt"), $"{salesTotal}{Environment.NewLine}");
    
  2. Ctrl+S / Cmd+S キーを押して、Program.cs ファイルを保存します。

プログラムを実行する

  1. ターミナルからプログラムを実行します。

    dotnet run
    

    プログラムからの出力はありません。 salesTotalDir/totals.txt ファイルを確認すると、sales.json ファイルからのすべての売上の合計が見つかります。

  2. プログラムをターミナルからもう一度実行します。

    dotnet run
    
  3. salesTotalDir/totals.txt ファイルを選択します。

    これで、totals.txt ファイルに 2 行目が含まれるようになりました。 プログラムを実行するたびに、該当する合計が再び加算され、新しい行がファイルに書き込まれます。

素晴らしいです。 Tailwind Traders がすべての店舗の売上を毎晩処理するために使用できるスマートで、堅牢かつ便利なツールを作成しました。 次のユニットでは、学習した内容と、覚えておくべきいくつかのヒントを確認します。

行き詰まっていますか?

この演習中に行き詰まった場合のために、このプロジェクトの完全なコードを以下に示します。

using Newtonsoft.Json; 

var currentDirectory = Directory.GetCurrentDirectory();
var storesDirectory = Path.Combine(currentDirectory, "stores");

var salesTotalDir = Path.Combine(currentDirectory, "salesTotalDir");
Directory.CreateDirectory(salesTotalDir);   

var salesFiles = FindFiles(storesDirectory);

var salesTotal = CalculateSalesTotal(salesFiles);

File.AppendAllText(Path.Combine(salesTotalDir, "totals.txt"), $"{salesTotal}{Environment.NewLine}");

IEnumerable<string> FindFiles(string folderName)
{
    List<string> salesFiles = new List<string>();

    var foundFiles = Directory.EnumerateFiles(folderName, "*", SearchOption.AllDirectories);

    foreach (var file in foundFiles)
    {
        var extension = Path.GetExtension(file);
        if (extension == ".json")
        {
            salesFiles.Add(file);
        }
    }

    return salesFiles;
}

double CalculateSalesTotal(IEnumerable<string> salesFiles)
{
    double salesTotal = 0;
    
    // Loop over each file path in salesFiles
    foreach (var file in salesFiles)
    {      
        // Read the contents of the file
        string salesJson = File.ReadAllText(file);
    
        // Parse the contents as JSON
        SalesData? data = JsonConvert.DeserializeObject<SalesData?>(salesJson);
    
        // Add the amount found in the Total field to the salesTotal variable
        salesTotal += data?.Total ?? 0;
    }
    
    return salesTotal;
}

record SalesData (double Total);