Cvičení – čtení souborů a zápis do souborů

Dokončeno

Třídu File v .NET lze použít rovněž k zápisu dat do souborů a ke čtení dat ze souborů.

Svůj mistrovský kousek .NET pro firmu Tailwind Traders už máte skoro hotový. Zatím váš kód přečte jakýkoli zadaný adresář, najde všechny soubory .json a vytvoří soubor totals.txt.

V tomto cvičení dokončíte projekt čtením souborů .json, sečtením celkových součtů úložiště a zápisem celkového součtu do souboru totals.txt .

Přidání Json.NET do projektu

  1. Pomocí terminálu přidejte Json.NET do projektu.

    dotnet add package Newtonsoft.Json
    

Příprava na data prodeje

  1. V horní části pole Program.cspřidejte using Newtonsoft.Json:

    using Newtonsoft.Json;
    
  2. Přímo Program.cs pod metodu FindFiles přidejte novourecord, která modeluje data sales.json:

    record SalesData (double Total);
    

Vytvoření metody pro výpočet celkových tržeb

  1. Těsně Program.cspřed řádkem record , který jste přidali v předchozím kroku, vytvořte novou funkci, která vypočítá celkový prodej. Tato metoda by měla převzít IEnumerable<string> z cest k souborům a projít ho.

    double CalculateSalesTotal(IEnumerable<string> salesFiles)
    {
        double salesTotal = 0;
    
        // READ FILES LOOP
    
        return salesTotal;
    }
    
  2. V rámci této metody nahraďte // READ FILES LOOP smyčkou, která iteruje salesFilessoubor , přečte soubor, parsuje obsah jako JSON a potom zvýší salesTotal proměnnou hodnotou total ze souboru:

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

Volání metody CalculateSalesTotals

  1. Program.cs Do souboru přidejte volání CalculateSalesTotal do funkce těsně nad File.WriteAllText volání:

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

Zápis součtu do souboru totals.txt

  1. Program.cs V souboru upravte File.WriteAllText blok tak, aby zapisoval hodnotu salesTotal proměnné do souboru totals.txt. A když už jste v tom, změňte volání File.WriteAllText na File.AppendAllText, aby se v souboru nic nepřepsalo.

    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. Stisknutím kombinace kláves Ctrl+S / Cmd+S uložte soubor Program.cs.

Spuštění programu

  1. Spusťte program z terminálu:

    dotnet run
    

    Z programu nevznikne žádný výstup. Pokud se podíváte do souboru salesTotalDir/totals.txt , najdete celkový součet všech prodejů ze souboru sales.json .

  2. Znovu spusťte tento program z terminálu.

    dotnet run
    
  3. Vyberte soubor salesTotalDir/totals.txt.

    Soubor total.txt má nyní druhý řádek. Pokaždé, když program spustíte, se součty znovu nasčítají a do souboru se zapíše nový řádek.

Skvělá práce! Napsali jste inteligentní, robustní a užitečný nástroj, který ve firmě Tailwind Traders mohou každou noc použít ke zpracování tržeb ze všech prodejen. V další lekci si probereme, co jste se naučili, a přidáme pár tipů, které byste si měli zapamatovat.

Zasekli jste se?

Pokud jste se během tohoto cvičení zasekli, tady je úplný kód pro tento projekt:

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