Удалить указанное c слово из .txt файла C# - PullRequest
1 голос
/ 22 апреля 2020

Итак, я работал над консольной системой инвентаризации, которая имела бы опции для добавления / удаления вещей и сохранения их в текстовом файле. Мне удалось добавить что-то в файл .txt и сохранить его, но я не могу удалить определенные c слова из файла .txt. Код, который я прикрепил ниже, должен удалить слово, которое было сохранено в строке, из открытого текстового файла. Но после запуска кода и проверки, есть ли он там или нет, я обнаружил, что он все еще там. Я новичок в C#, поэтому у меня нет особых знаний об этом, поэтому любая помощь будет оценена!

static void RemoveStock()
{
    Console.WriteLine("==============================");
    string filePath = @"C:\Users\Ibrah\OneDrive\Desktop\SDAM\Stock Management\Stock Management System\Intentory System\database\Stock.txt.txt";
    List<string> lines = new List<string>();
    lines = File.ReadAllLines(filePath).ToList();

    Console.WriteLine("Enter the item code you'd like to remove: ");
    string itemCode = Console.ReadLine();
    lines.Remove(itemCode);
    File.WriteAllLines(filePath, lines);

}

Кроме того, после исправления вышеизложенного. Что я забыл упомянуть, так это, например, когда я добавляю в свой инвентарь (текстовый файл) код изделия AP01 с количеством 100. В моем текстовом файле он будет содержать следующее:

AP01 100

Сейчас я пытаюсь добиться того, чтобы после того, как я вставил свой itemCode для удаления элемента из текстового файла, я пытаюсь попросить пользователя ввести количество. Так, например, если я поставлю itemCode как AP01 (для удаления), он попросит меня ввести значение, например 25.

Так что

AP01 100

станет этим

AP01 75

вот мой обновленный код после того, как я получил свой ответ:

    Console.WriteLine("==============================");
    string filePath = @"C:\Users\Ibrah\OneDrive\Desktop\SDAM\Stock Management\Stock Management System\Intentory System\database\Stock.txt.txt";
    List<string> lines = new List<string>();
    lines = File.ReadAllLines(filePath).ToList();

    Console.WriteLine("Enter the item code you'd like to remove: ");
    string itemCode = Console.ReadLine();
    Console.WriteLine("Enter the amount that you'd like to remove: ");
    string itemQuantity = Console.ReadLine();

    var newLines = lines.Where(line => !line.Contains(itemCode, StringComparison.OrdinalIgnoreCase));
    File.WriteAllLines(filePath, newLines);

1 Ответ

1 голос
/ 22 апреля 2020

Выполнение List<T>.Remove() удалит только запись из списка, а не обязательно слово. Это при условии, что текстовый файл имеет больше, чем код элемента в строке. Предполагая, что текстовый файл выглядит примерно так:

Hello world

Да, какой прекрасный день, чтобы поздороваться

Добрый день

Чем вы можете написать следующий код для удаления «Hello»:

string filePath = @"path\to\file.txt";
var lines = File.ReadAllLines(filePath);
string itemCode = "Hello";
// If you don't want the replace to be case insensitive, do line.Replace(itemCode, string.Empty)
var newLines = lines.Select(line => Regex.Replace(line, itemCode, string.Empty, RegexOptions.IgnoreCase));
File.WriteAllLines(filePath, newLines);

Вывод будет:

world

Да, что за прекрасный день это сказать

Добрый день

Если вы хотите удалить строку, содержащую ваш код товара, замените newLine на:

var newLines = lines.Where(line => !line.Contains(itemCode, StringComparison.OrdinalIgnoreCase));

Какой результат будет

Добрый день

Редактировать

На основании ваших правок вы скорее всего, вы захотите создать модель для представления элементов в вашем текстовом файле, например:

public class Item
{
    public Item(string input)
    {
        var splitInput = input.Split(' ');
        Code = splitInput[0];
        Qty = int.Parse(splitInput[1]);
    }

    public Item(string code, int qty)
    {
        Code = code;
        Qty = qty;
    }

    public string Code { get; }
    public int Qty { get; }

    public override string ToString()
    {
        return $"{Code} {Qty}";
    }
}

И код будет выглядеть примерно так:

static void Main(string[] args)
{

    string filePath = @"path\to\file.txt";
    var lines = File.ReadAllLines(filePath).Select(line => new Item(line));

    string itemCode = "AP01";
    int qty = 25;

    var newLines = lines
        .Select(item => item.Code == itemCode ? new Item(item.Code, item.Qty - qty) : item)
        .Where(item => item.Qty > 0)
        .Select(item => item.ToString());

    File.WriteAllLines(filePath, newLines);
}

Это уменьшит количество и, если они равны 0 или меньше, удалите их из текстового файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...