Загрузка...

[C#] Чтение строк из файла с разделителем

Тема в разделе C# создана пользователем SEMPAI 10 июл 2017. (поднята 10 июл 2017) 2792 просмотра

Загрузка...
  1. SEMPAI
    SEMPAI Автор темы 10 июл 2017 /sempai/ 261 25 ноя 2016
    Для тех кто впервые тут и не шарит в Visual Studio рекомендую ознакомиться - Тыкай
    ===================================
    Что мы будем делать?
    1. Открытие .txt файла через кнопку
    2. Считывание строк и деление на "Логин" и "Пароль" через разделитель ( : или ; )
    3. Вывод этих строк в листбоксы
    ===================================
    Приступим
    ===================================
    Нам нужнo:
    2 Buttons
    2 listBox
    1 checkBox
    1 openfiledialog
    ===================================
    И так у меня
    Кнопка "Загрузить файлик" - "button1"
    Кнопка "Старт" - "button2"
    ЛистБокс с логинами - "listBox1"
    ЛистБокс с паролями - "listBox2"
    Чекбокс - "checkBox1"
    [IMG]
    ===================================
    Дабл клик по кнопке "Загрузить файлик"
    Открылся код
    Ищем в коде
    public Form1()
    {
    InitializeComponent();
    }

    И под InitializeComponent(); вставляем:
    openFileDialog1.Filter = "Текстовый документ | *.txt";
    Это значит что наше диалоговое окно может брать только .txt файл
    [IMG]
    Так же без использования кода можно добавить в свойство Filter - Текстовый документ | *.txt
    [IMG]
    ===================================
    Снова открываем вкладку с кодом
    Добавляем public переменные (значит что их можно использовать по всему коду, а не только для одной кнопки)
    Добавлять их надо так, чтобы они не попали в действия { } кнопки, чекбокса, или еще чего либо.
    Переменные:
    public string filename = @"";
    public string razdelitel;
    public string login, pass;

    [IMG]
    ===================================
    Возвращаемся в редактор дизайна
    И снова кликаем много раз по "загрузить файл"
    Теперь вписываем туда
    if(openFileDialog1.ShowDialog() == DialogResult.OK)
    {
    filename = openFileDialog1.FileName;
    }
    P.S можно не использовать { } так как делается только одно действие
    Это значит мы будем открывать openFileDialog и если на диалоге было нажато ОК, то в переменную filename записывается путь к файлу.
    [IMG]
    ===================================
    Теперь кликнем много раз по кнопке "Старт"
    Перед тем как вставить код используйте библиотеку (в самом начале кода (в самом самом)) он нужен для работы с текстом
    using System.IO;
    Тут кода поболее:
    string[] split;
    StreamReader Filen = new StreamReader(filename);
    while((razdelitel = Filen.ReadLine()) != null) {
    if(checkBox1.Checked)
    {
    split = razdelitel.Split(':');
    }
    else { split = razdelitel.Split(';'); }
    login = split[0];
    pass = split[1];
    listBox1.Items.Add(login);
    listBox2.Items.Add(pass);
    }
    Filen.Close();
    [IMG]
    Да, я знаю что можно был не добавлять перемнные login и pass,а написать
    listBox1.Items.Add(split[0]);
    listBox2.Items.Add(split[1]);
    но так как создано для новиков, мне кажется что так будет немного понятнее для них.
    ===================================
    [IMG]
    ===================================
    Кому что не понятно - пишите в комментарии, помогу.
    #моястатья
     
    10 июл 2017 Изменено
  2. _GOD_
    _GOD_ 13 июл 2017 C# PHP JS NodeJS Python MongoDb 305 8 янв 2017
    На мой взгляд было бы практичнее сделать автоматическое определение разделителя через if (razdelitel.Contains(";"))
    Да и много лишнего, даже для новичков
     
  3. Hangover_inactive59523
    нет, это такое же говно как и у тса.
    вот идеал Split(new [] {';',':'})
    без скрытой рекламы
     
  4. _GOD_
    _GOD_ 13 июл 2017 C# PHP JS NodeJS Python MongoDb 305 8 янв 2017
    А почему сразу не так Split(new[] { ':', ';', '\t', ' ' }); что бы мусор отсеять(если он там есть)?
     
  5. Hangover_inactive59523
    Какой-то сложный рофл.
    Для валидации строки, лучше регулярку использовать
     
  6. TheBottle
    TheBottle 13 июл 2017 Заблокирован(а) 18 15 июн 2017
    Код
    namespace ConsoleApp1
    {
    class Program
    {
    static void Main(string[] args)
    {
    List<Account> acclist = new List<Account>(); //Создание листа куда мы будем добавлять аккаунты
    using (StreamReader inputfile = new StreamReader("Code.txt")) // Инициализация StreamReader с первым аргументом - пути до файла
    {
    while (inputfile.ReadLine() != null) // Пока есть данные - читаем их
    {
    string inputstring = inputfile.ReadLine(); // Читаем строку
    string[] splitstring = inputstring.Split(new[] { ';', ':' }); // Разделяем строку by Hangover
    acclist.Add(new Account {Login = splitstring[0], Password = splitstring[1] }); // Добавляем элемент в лист
    }
    } // Уничтожаем объект inputfile юзая using - Аналог метод Dispose или Close
    }
    }

    class Account
    {
    public string Login;
    public string Password;
    }
    }
    Не нужно новичков приучать к говнокоду)

    [IMG]
     
  7. Hangover_inactive59523
    ещё бы изменить поля в классе аккаунт на свойства и будет збс
     
  8. TheBottle
    TheBottle 13 июл 2017 Заблокирован(а) 18 15 июн 2017
    Инкапсуляция по моему мнению тут не к чему, тем более если пример для новичков.

    Ну а так поля инициализируются очень легко
    Код
    class Account
    {
    private string _login;
    private string _password;
    public string Login
    {
    get
    {
    return _login;
    }
    set
    {
    _login = value;
    }
    }
    public string Password
    {
    get
    {
    return _password;
    }
    set
    {
    _password = value;
    }
    }
    }
     
  9. Hangover_inactive59523
    че так

    Я бы вообще убрал сетер и инициализировал бы через конструктор )))
     
Top