Загрузка данных


import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class ShoppingListScanner {

    static class Item {
        String name;
        BigDecimal price;

        Item(String name, BigDecimal price) {
            this.name = name;
            this.price = price;
        }
    }

    public static void main(String[] args) {
        String fileName = "shopping_list.txt";

        // 1. Создаем тестовый файл (для демонстрации, чтобы код работал сразу)
        createTestFile(fileName);

        List<Item> items = new ArrayList<>();
        BigDecimal totalPrice = BigDecimal.ZERO;

        // 2. Используем Scanner для чтения созданного файла
        File file = new File(fileName);
        
        // try-with-resources автоматически закроет Scanner после выполнения программы
        try (Scanner scanner = new Scanner(file, "UTF-8")) {
            
            // Построчно читаем файл до самого конца
            while (scanner.hasNextLine()) {
                String line = scanner.nextLine().trim();
                
                // Пропускаем пустые строки, если они есть в файле
                if (line.isEmpty()) {
                    continue;
                }

                // Находим последний пробел для разделения названия и цены
                int lastSpaceIndex = line.lastIndexOf(" ");
                
                if (lastSpaceIndex != -1) {
                    String name = line.substring(0, lastSpaceIndex).trim();
                    String priceStr = line.substring(lastSpaceIndex + 1).trim();

                    try {
                        BigDecimal price = new BigDecimal(priceStr);
                        items.add(new Item(name, price));
                        totalPrice = totalPrice.add(price);
                    } catch (NumberFormatException e) {
                        System.out.println("❌ Ошибка чтения цены в строке: \"" + line + "\"");
                    }
                }
            }

        } catch (IOException e) {
            System.out.println("❌ Не удалось прочитать файл: " + e.getMessage());
            return;
        }

        // 3. Расчет аналитики и вывод чека (если файл не был пустым)
        int totalItems = items.size();
        if (totalItems == 0) {
            System.out.println("⚠ Файл прочитан, но список покупок пуст!");
            return;
        }

        BigDecimal averagePrice = totalPrice.divide(BigDecimal.valueOf(totalItems), 2, RoundingMode.HALF_UP);
        BigDecimal vatRate = new BigDecimal("0.20");
        BigDecimal vatDivider = new BigDecimal("1.20");
        BigDecimal vatAmount = totalPrice.multiply(vatRate).divide(vatDivider, 2, RoundingMode.HALF_UP);

        Item mostExpensive = items.get(0);
        Item leastExpensive = items.get(0);

        for (Item item : items) {
            if (item.price.compareTo(mostExpensive.price) > 0) mostExpensive = item;
            if (item.price.compareTo(leastExpensive.price) < 0) leastExpensive = item;
        }

        // Вывод красивого отчета в консоль
        System.out.println("==================================================");
        System.out.printf("%-50s\n", "      ЧЕК ИЗ ФАЙЛА: " + fileName);
        System.out.println("==================================================");

        for (int i = 0; i < items.size(); i++) {
            Item item = items.get(i);
            String displayName = item.name.length() > 35 ? item.name.substring(0, 32) + "..." : item.name;
            System.out.printf("%2d. %-35s %8.2f руб.\n", (i + 1), displayName, item.price);
        }

        System.out.println("--------------------------------------------------");
        System.out.printf("%-38s %8d\n", "Всего позиций в файле:", totalItems);
        System.out.printf("%-38s %8.2f руб.\n", "ИТОГО К ОПЛАТЕ:", totalPrice);
        System.out.println("--------------------------------------------------");
        System.out.printf("%-38s %8.2f руб.\n", "В том числе НДС (20%):", vatAmount);
        System.out.printf("%-38s %8.2f руб.\n", "Средняя стоимость товара:", averagePrice);
        System.out.println("--------------------------------------------------");
        System.out.printf("⭐ Самый дорогой товар: %s (%.2f руб.)\n", mostExpensive.name, mostExpensive.price);
        System.out.printf("🛒 Самый бюджетный товар: %s (%.2f руб.)\n", leastExpensive.name, leastExpensive.price);
        System.out.println("==================================================");
    }

    // Вспомогательный метод для автоматического создания текстового файла
    private static void createTestFile(String fileName) {
        try (FileWriter writer = new FileWriter(fileName, false)) {
            writer.write("Молоко цельное пастеризованное 89.90\n");
            writer.write("Хлеб Бородинский нарезка 45\n");
            writer.write("Кофе в зернах Арабика 100% 1250.55\n");
            writer.write("Шоколад горький 99.9% 149.00\n");
            writer.write("Сыр Пармезан выдержанный 450.25\n");
            System.out.println("💾 Файл '" + fileName + "' успешно создан/обновлен для теста.\n");
        } catch (IOException e) {
            System.out.println("Не удалось создать тестовый файл: " + e.getMessage());
        }
    }
}