Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > c# посимвольное чтение из файла. И немного еще...


Автор: WantToProg 22.11.2009, 21:38
Доброе время суток. Я уверен, что многие рано или поздно встречаются с такой задачей. вот и я прошу помочь натолкнув на мысль.
К сожалению не понял как это сделать из примеров в сети.
В распоряжении C# есть ReadLine, а как с ее помощь. это сделать, я не знаю
Имеется файл с содержимым в несколько строк. Это одна из строк

100001;000001;Name;FullName;65,00;0;1;0,1,1,0,0,0, 0,1;;;;;; 


Разделителем является точка с запятой ";".
Мне необходимо считать строку в массив для последующей обработки.
Первые символы до ";" порядковый код, вторые после ";" управляющие. Т.о. Программа из вне будет обращаться с кодом управления(000001 в данной строке, в каждой строке он разный), и должна будет получить Name и FullName, остальные цифры не нужны.
Заранее очистить файл от мусора не предоставляется возможности, да и думаю это не существенно.

В идеале было бы лучшим добавление этих данный в DataGridView, но с ней пока не разобрался.
PS: среда Visual Studio pro edition, С# 

Автор: tol05 22.11.2009, 22:15
первый этап:
Код

string inputString = Console.ReadLine();
string[] inputParts = inputString.Split(';');

int controlCode = Int32.Parse(inputParts[1]);
string Name = inputParts[2];
string FullName = inputParts[3];


второй этап:
Создаете тип данных Data, содержащий свойства ControlCode, Name, FullName и т.п.
Накапливаете данные и создаете любую коллекцию объектов Data
Биндите коллекцию к DataGridView

Автор: Heinzz 22.11.2009, 22:19
те надо считывать первые четыре значения каждой строки? Используйте Regex

Автор: WantToProg 22.11.2009, 22:50
tol05, Благодарю, хороший намек. сейчас буду пробовать. Не понял только фразу Биндите колекцию, это как я понимаю через binding source?


Heinzz, Да, вы совершенно правы. И размещать их в таблицу, чтоб по приходящему запросу на управляющий код (вторые после ";" символы) выдавалось значение Name и FullName

Автор: tol05 22.11.2009, 23:33
это метод String.Split
(ни о каком потоке нигде было не сказано ни слова. я оперировал только той информацией, которую мне показал браузер)

в случае потока - ищите метод ReadLine, ReadToEnd и т.д. и т.п. В конце концов - из массива байт получите строку через класс Encoding

Автор: WantToProg 22.11.2009, 23:54
tol05, Извиняюсь за ранее неправильную информацию. Я уже отредактировал сообщение. Своя опечатка была, поспешил.

Можно вас попросить поподробнее про:

Цитата(tol05 @  22.11.2009,  22:15 Найти цитируемый пост)
Создаете тип данных Data, содержащий свойства ControlCode, Name, FullName и т.п.
Накапливаете данные и создаете любую коллекцию объектов Data
Биндите коллекцию к DataGridView 

?

Пожалуйста smile

Автор: tol05 23.11.2009, 00:15
Понимаете, WantToProg, для каждой конкретной .Net-based технологии биндинг данных к контролу делается по-разному.
Вы создаете тему в общем (будем выражаться безпредметном) разделе. Не указываете какой вид приложения Вы разрабатываете. Winforms, ASP.NET, WPF
Если Вы упоминаете DataGridView - значит это все-таки Winforms ? (я просмотрел это вначале.... не догадался т.е. )) )

Кроме того, вопрос действительно задан в таком общем виде, что конкретно на него ответить трудно...

А теперь конкретно )
Да, BindingSource. Ппосле создания коллекции объектов (например List<NeededData>) используйте ее как источник данных. Пример показан в msdn (см. DataGridView.DataSource property)

Автор: WantToProg 23.11.2009, 01:11
Я сделал следующее. Предоставлю немного кода сюда.
Код

private void openToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                String Filename, fs, con, FullName, name;
                String n, TabN;                
                Filename = openFileDialog1.FileName;
                StreamReader sr = new StreamReader(Filename, System.Text.Encoding.Default);

                while ((con = sr.ReadLine()) != null)
                {
                    string[] split = con.Split(';');
                    n = split[0];
                    TabN = split[1];
                    name = split[2];
                    FullName = split[3];                    
                }
                sr.Close();
                sw.Close();
                tabControl1.Visible = true;
                richTextBox1.Text = "Данные из файла  " + Filename + "  успешно загружены" + "\n";
            }

        }


Делаю действительно в windows forms. На рабочей панели разместил объект DataGridView, думал легко разберусь как туда добавлять данные, оказалось, что не легко :(
Я немного выхожу за пределы моей темы, но раз уж не отказали в ответе, буду признателен если поможете дальше.

Так вот, мне надо куда нибудь сохранить полученные программой данные из файла, чтоб к ним можно было делать запросы по TabN. 
А вот куда сохранить и как это сделать, я пытаюсь разобраться сейчас, пока что ни туда ни сюда.
Сейчас читаю информацию из msdn, но по примеру сделать не получается (http://msdn.microsoft.com/ru-ru/library/system.data.datatable.aspx)

Автор: Zakonnic 23.11.2009, 09:54
http://msdn.microsoft.com/ru-ru/library/ms171600(loband).aspx

Автор: tol05 23.11.2009, 11:59
Код

List<MyData> dataList; //член какого-нибудь класса, доступный через какое-нибудь свойство

private void openToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                String Filename, fs, con, FullName, name;
                String n, TabN;                
                Filename = openFileDialog1.FileName;
                StreamReader sr = new StreamReader(Filename, System.Text.Encoding.Default);

dataList = new List<MyData>();

                while ((con = sr.ReadLine()) != null)
                {
                    string[] split = con.Split(';');
MyData data = new MyData();
data.N = split[0];
data.TabN = split[1];
data.Name = split[2];
data.FullName = split[3];
dataList.Add(data);
//                    n = split[0];
//                   TabN = split[1];
//                    name = split[2];
//                    FullName = split[3];                    
                }
                sr.Close();
                sw.Close();
                tabControl1.Visible = true;
                richTextBox1.Text = "Данные из файла  " + Filename + "  успешно загружены" + "\n";
            }
        }

пример http://dotnetperls.com/datagridview-tips (см пункт 3. Using objects)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)