演習 - ファイルに対する読み取りと書き込みを行う
.NET の File
クラスを使用して、ファイルにデータを書き込んだり、ファイルからデータを読み取ったりすることもできます。
あなたは、Tailwind Traders 用の .NET の傑作をほぼ作成し終えました。 これまでのところ、コードによって、ディレクトリが読み取られ、すべての .json ファイルが検索され、totals.txt ファイルが作成されています。
この演習では、.json ファイルを読み取り、店舗の合計を加算し、総計を totals.txt ファイルに書き込むことで、プロジェクトを完了させます。
System.Text.Json をプロジェクトに追加する
ターミナルを使用し、Json.NET をプロジェクトに追加します。
dotnet add package System.Text.Json
売上データの準備
Program.cs
の先頭にusing Newtonsoft.Json
を追加します。using System.Text.Json;
Program.cs
のFindFiles
メソッドの直下に、sales.json データをモデル化する新しいrecord
を追加します。record SalesData (double Total);
売上合計を計算するメソッドを作成する
売上合計を計算する新しい関数を、
Program.cs
の前の手順で追加したrecord
行の直前に作成します。 このメソッドで、反復処理が可能なファイルのパスのIEnumerable<string>
を受け取る必要があります。double CalculateSalesTotal(IEnumerable<string> salesFiles) { double salesTotal = 0; // READ FILES LOOP return salesTotal; }
そのメソッド内で、
// 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 メソッドを呼び出す
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 ファイルに合計を書き込む
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}");
Ctrl+S / Cmd+S キーを押して、Program.cs ファイルを保存します。
プログラムを実行する
ターミナルからプログラムを実行します。
dotnet run
プログラムからの出力はありません。 salesTotalDir/totals.txt ファイルを確認すると、sales.json ファイルからのすべての売上の合計が見つかります。
プログラムをターミナルからもう一度実行します。
dotnet run
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);