Ćwiczenie — odczytywanie i zapisywanie w plikach
Klasy File na platformie .NET można używać również do zapisywania danych w plikach i odczytywania danych z plików.
Arcydzieło platformy .NET dla firmy Tailwind Traders jest już prawie gotowe. Do tej pory kod odczytuje dowolny katalog, znajduje wszystkie pliki .json i tworzy plik totals.txt .
W tym ćwiczeniu ukończysz projekt, odczytując pliki .json, sumując wszystkie sumy sklepów i zapisując sumę końcową do pliku totals.txt.
Dodawanie pliku Newtonsoft.Json do projektu
Za pomocą terminalu dodaj plik Newtonsoft.Json do projektu.
dotnet add package Newtonsoft.Json
Przygotowanie do danych sprzedaży
W górnej części pliku
Program.csdodaj polecenieusing Newtonsoft.Json:using Newtonsoft.Json;Bezpośrednio pod metodą
Program.cs,FindFiles, która modeluje danerecord:record SalesData (double Total);
Tworzenie metody, która oblicza sumy sprzedaży
W
Program.cspliku tuż przed wierszem dodanymrecordw poprzednim kroku utwórz nową funkcję, która oblicza sumę sprzedaży. Ta metoda powinna przyjmować wartośćIEnumerable<string>ścieżek plików, po których może iterować.double CalculateSalesTotal(IEnumerable<string> salesFiles) { double salesTotal = 0; // READ FILES LOOP return salesTotal; }W ramach tej metody zastąp
// READ FILES LOOPpętlą, która iterujesalesFilesplik , odczytuje plik, analizuje zawartość w formacie JSON, a następnie zwiększasalesTotalzmienną ototalwartość z pliku: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; }
Wywoływanie metody CalculateSalesTotals
Program.csW pliku dodaj wywołanie funkcjiCalculateSalesTotaltuż nad wywołaniemFile.WriteAllText: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);
Zapisywanie sumy w pliku totals.txt
W pliku
Program.cszmodyfikuj blokFile.WriteAllText, aby zapisać w plikusalesTotalwartość zmiennej . Gdy jesteś w nim, zmieńFile.WriteAllTextwywołanie naFile.AppendAllText, aby nic w pliku nie było zastępowane.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}");Zapisz plik Program.cs, naciskając Ctrl+S / .
Uruchamianie programu
Uruchom program z poziomu terminalu:
dotnet runProgram nie wyświetli żadnych danych wyjściowych. Jeśli spojrzysz na plik salesTotalDir/totals.txt , znajdziesz sumę wszystkich sprzedaży z pliku sales.json .
Ponownie uruchom program w terminalu.
dotnet runWybierz plik salesTotalDir/totals.txt .
Plik totals.txt ma teraz drugi wiersz. Za każdym razem, gdy uruchamiasz program, sumy są ponownie dodawane i w pliku jest zapisywany nowy wiersz.
Doskonale! Napisałeś inteligentne, niezawodne i przydatne narzędzie, którego firma Tailwind Traders może używać do przetwarzania sprzedaży wszystkich swoich sklepów każdej nocy. W następnej lekcji podsumujemy to, czego się nauczyliśmy, i przedstawimy kilka porad, które warto zapamiętać na przyszłość.
Nie wiesz, co zrobić?
Jeśli podczas tego ćwiczenia utkniesz, oto pełny kod dla tego projektu:
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);