Ć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. Na razie Twój 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 sumy sklepów i zapisując sumę końcową do pliku totals.txt .
Dodawanie pliku System.Text.Json do projektu
Przy użyciu terminalu dodaj bibliotekę Json.NET do projektu.
dotnet add package System.Text.Json
Przygotowanie do danych sprzedaży
W górnej części pliku
Program.cs
dodaj polecenieusing Newtonsoft.Json
:using System.Text.Json;
W
Program.cs
obszarzeFindFiles
metody dodaj nowąrecord
, która modeluje dane sales.json:record SalesData (double Total);
Tworzenie metody w celu obliczenia sum sprzedaży
W
Program.cs
pliku tuż przed wierszem dodanymrecord
w 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 LOOP
pętlą, która iterujesalesFiles
plik , odczytuje plik, analizuje zawartość w formacie JSON, a następnie zwiększasalesTotal
zmienną ototal
wartość 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 = JsonSerializer.Deserialize<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.cs
W pliku dodaj wywołanie funkcjiCalculateSalesTotal
tuż 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
Program.cs
W pliku zmodyfikujFile.WriteAllText
blok, aby zapisać wartośćsalesTotal
zmiennej w pliku totals.txt. Gdy jesteś w nim, zmieńFile.WriteAllText
wywoł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}");
Naciśnij Ctrl+S / Cmd+S, aby zapisać plik Program.cs.
Uruchamianie programu
Uruchom program z poziomu terminalu:
dotnet run
Program 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 run
Wybierz 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! Dzięki Tobie firma Tailwind Traders ma inteligentne, niezawodne i przydatne narzędzie, za pomocą którego co wieczór może przetwarzać sprzedaż ze wszystkich swoich sklepów. 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);