Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.12.2016, 19:13   #1
razien777
Новичок
Джуниор
 
Регистрация: 12.12.2016
Сообщений: 4
По умолчанию Разбитие текстового файла на блоки и их последующее копирование

Уважаемые, доброго времени суток!
Начал изучать C# и решил для пробы написать программу, которая будет считывать файл баз данных 1с ibases.v8i.

Хочу чтобы кусок от 1 БД объединялся в блок и выводился в форму под именем БД (ListBox или DataGrid).

И в будущем выделяя его и нажимая на кнопку стрелки выделенная БД копировалась в списки баз пользователя.

Пример файла ibases (есть проблема в том, что у баз может быть разное кол-во строк, т.е. в конце может быть DefaultApp, а может и не быть)


[123]
Connect=Srvr="";Ref="";
ID=5151203e-e4b1-4b84-8f26-59cfd54a4995
OrderInList=16898.43903166217
Folder=/
OrderInTree=2146560
External=0
ClientConnectionSpeed=Normal
App=Auto
WA=1
Version=8.3
[321]
Connect=Srvr="l";Ref="";
ID=a130f55e-7abb-4666-919e-eecc94f239e0
OrderInList=17483.53390442648
Folder=/
OrderInTree=2113792
External=0
ClientConnectionSpeed=Normal
App=Auto
WA=1
Version=8.3
DefaultApp=ThickClient


Пока добился вывода списка баз в ListBox(но вывод только имен, а не блоков...). Но как скопировать именно блок понять не могу.

Подскажите новичку как решить сию проблему!)


Код:
        private void button1_Click(object sender, EventArgs e)
        {
            FromList.Items.Clear();
            OpenFileDialog openFileDialog1 = new OpenFileDialog();
            openFileDialog1.Filter = "1c ibases (*.v8i)|*.v8i";
 
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                textBox1.Text = openFileDialog1.FileName;
 
                string[] lines = File.ReadAllLines(textBox1.Text);
                foreach (string from in lines)
                    if (from.Contains("[") & from.Contains("]"))
                    {
                        FromList.Items.Add(from);
                    }
            }
        }

Последний раз редактировалось Alex11223; 12.12.2016 в 19:17.
razien777 вне форума Ответить с цитированием
Старый 12.12.2016, 19:23   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Что-то не очень понял что вы сделать хотите.

Для "И" в условиях лучше использовать &&, а не &. (& тоже работает, но так никто не пишет и && эффективнее, не будет вычислять вторую часть если первая false)
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 12.12.2016, 19:39   #3
razien777
Новичок
Джуниор
 
Регистрация: 12.12.2016
Сообщений: 4
По умолчанию

Я хочу чтобы по нажатию кнопки из основного файла ibases(ранее загруженного) блок с базой , допустим 123, добавился в другой файл ibases.
Вопрос можно ли как-то указать, чтобы блок состоял из строк начинаясь со знака "[" и заканчивался тем же знаком "[" (10-12 строк)? И чтобы в списке блок значился как название БД (123 например). Затем при нажатие кнопки этот блок копировался в другой файл открытый рядом.
razien777 вне форума Ответить с цитированием
Старый 12.12.2016, 21:04   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Да, например просто в цикле читать и добавлять пока не встретится второй блок (или конец файла)

Для выделения названия .Substring например.

То есть в целом так:
Код:
прочитать_название();
цикл_с_чтением_данных_блока();
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 12.12.2016, 21:45   #5
razien777
Новичок
Джуниор
 
Регистрация: 12.12.2016
Сообщений: 4
По умолчанию

Ну вот собственно вопрос: как приблизительно должен выглядеть цикл выделения блока строк? Я нигде не нашел...
razien777 вне форума Ответить с цитированием
Старый 12.12.2016, 22:02   #6
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Так можно просто в цикле проходить массив пока не встретился [ ], почти как в коде из первого сообщения.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 13.12.2016, 08:19   #7
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Формат файла называется ini, раньше был популярен. Можете поискать какую-нибудь библиотеку для работы с этим форматом.
По-нормальному нужно заодно проверять корректность файла и прочее. Можно и забить на это. Если совсем уж делать на коленке, то можно действовать как-то так:
Создать вспомогательный класс типа:
Код:
public class MyItem
    {
        public string Name;
        public List<string> Values;

        public MyItem(string name)
        {
            Name = name;
            Values = new List<string>();
        }

        public override string ToString()
        {
            return Name;
        }
    }
В Name будет записываться то, что в квадратных скобках, а в Values строки соответствующего раздела.
Заполнение списка тогда будет выглядеть как-то так:
Код:
         foreach (string from in lines)
                if (from.StartsWith("[") & from.EndsWith("]"))
                {
                    FromList.Items.Add(new MyItem(from));
                }
                else
                {
                    (FromList.Items[FromList.Items.Count - 1] as MyItem).Values.Add(from);
                }
Принцип простой: если строка начинается и заканчивается квадратной скобкой, значит это новый раздел, добавляем новую запись в список. Если скобок нет, значит к последнему добавленному разделу добавляем строку.
Для проверки можете закинуть на форму еще какой-нибудь listbox, создать обработчик события, скажем SelectedIndexChanged
Код:
private void FromList_SelectedIndexChanged(object sender, EventArgs e)
        {
            MyItem item = FromList.SelectedItem as MyItem;
            if (item != null)
            {
                listBox1.Items.Clear();
                foreach (var i in item.Values)
                    listBox1.Items.Add(i);
            }
        }
Теперь при выделении элементов в FromList, в listBox1 должны будут показываться строки из файла для соответствующей базы, можно сравнить с тем, что записано в файле.
pu4koff вне форума Ответить с цитированием
Старый 13.12.2016, 09:38   #8
razien777
Новичок
Джуниор
 
Регистрация: 12.12.2016
Сообщений: 4
По умолчанию

Спасибо большое! Буду пробовать.
razien777 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
парсинг текстового файла (Си) _BYTE Помощь студентам 0 14.12.2013 20:58
копирование текста из одного текстового файла в другой Miserable_Silence Помощь студентам 0 24.01.2013 15:52
Анализ текстового файла на С++ Jeanna123 Фриланс 4 27.08.2012 09:34
Считывание текстового файла Waqq Общие вопросы Delphi 4 24.01.2011 20:43
Из текстового файла в бд!!! Poltev86 БД в Delphi 5 16.05.2010 23:18