Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
3 / 3 / 2
Регистрация: 21.10.2013
Сообщений: 209
1

Чтение массива из файла в textbox и сохранение его в виде матрицы

06.07.2015, 14:19. Показов 2316. Ответов 9
Метки нет (Все метки)

Здравствуйте!
Читаю массив из файла, после чего пихаю его в текстбокс, после чего надо сохранить прочтённый массив в виде матрицы, для дальнейших операций. Массив это 1млн строк на 2 столбца
По нажатию клавиши происходит следующее:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
        private void btnOpen_Click(object sender, EventArgs e)
        {
 
            Stream oStream = null;
            openFileDialog1.InitialDirectory = "c:\\";
            openFileDialog1.Filter = "txt files (*.txt)|*.txt|Allfiles (*.*)|*.*"; //1а-то что увидим в списке 1б -то что будет искаться; 2а-список 2б-будет искаться по всем файлам
            openFileDialog1.FilterIndex = 2;
            openFileDialog1.RestoreDirectory = true;
            if (openFileDialog1.ShowDialog() == DialogResult.OK) //открылось ли окно диалога
            {
                try
                {
                    if ((oStream = openFileDialog1.OpenFile()) != null) //попробовать: НЕ отсутствует ли файл
                    {
                        using (oStream)                     //пользуем имя файла
                        {
                           lblFile.Text = openFileDialog1.FileName;
                           tbfile.Text = File.ReadAllText(openFileDialog1.FileName);
                           int MatRow=1000000, MatCol=5;
                           double[,] mat = new double[MatRow,MatCol];
                           for (int i = 0; i < MatRow; i++)
                           {
                               for (int j = 0; j < MatCol; j++)
                               {
                                   mat[i, j] = Convert.ToDouble(File.ReadAllLines(openFileDialog1.FileName));
                               }
                           }  
                        }
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message);
                }
 
 
            }
 
 
        }
Я так понимаю считывая файл с помощью метода readalllines мы получаем массив строк,
которые я хотел преобразовать в тип double, но видимо надо как-то по другому.
Кстати readalllines прочитает весь файл, сам до конца, так?! поиска конца файла не надо?
Кроме того сейчас только воткнул, ведь readalllines считает фактически массив вида [n,1].
Следовательно надо разбить строку на 2 числа(в массиве они через пробел)
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.07.2015, 14:19
Ответы с готовыми решениями:

Сохранение данных массива из файла в виде матрицы
В файле данные одномерного массива, нужно эти данные сохранить в другой файл в виде матрицы 3x5,...

Сохранение текста из textbox и его чтение
Я придумал что то не вразумительное Stream l = new FileStream(&quot;login.txt&quot;,...

Автоматическое сохранение отчета Access в виде файла .txt на компьютере и отправка его в виде вложения по элек
Форумчане, доброго времени суток! Прошу помощи в решении следующей задачи: При выпуске изделий...

Чтение файла с сервера и сохранение его устройство
Есть код: var s:TStringStream; begin s:=TstringStream.Create; ...

9
868 / 718 / 304
Регистрация: 15.04.2013
Сообщений: 2,047
Записей в блоге: 5
06.07.2015, 14:45 2
ToLexx,
Какой у вас формат входного файла?
0
3 / 3 / 2
Регистрация: 21.10.2013
Сообщений: 209
06.07.2015, 14:50  [ТС] 3
вы имеете ввиду содержимое файла?
соответственно: массив [1000000,2] из чисел типа double - вещественные, как понимаю.
0
868 / 718 / 304
Регистрация: 15.04.2013
Сообщений: 2,047
Записей в блоге: 5
06.07.2015, 14:53 4
ToLexx,
Вам надо знать как расположены числа в строках, это вообще у вас не понятно что
C#
1
 mat[i, j] = Convert.ToDouble(File.ReadAllLines(openFileDialog1.FileName));
0
3 / 3 / 2
Регистрация: 21.10.2013
Сообщений: 209
06.07.2015, 15:53  [ТС] 5
да я уж понял что это дурь.
просто последовательность такая:
1) читаю - я так думаю readAllLines не подойдёт, т.к. он читает сразу весь файл до конца, значит надо чтение построчное. readlines??
2) перебираю строки в поисках разделителей и концов строк, благодаря чему появляется 2 столбца
3) в итоге получаю нужный массив из 1млн строк на 2 столбца.

Добавлено через 50 минут
Сейчас переделал, вот только опять не то(( при дебаге получается, что числа в массиве 0 0 00 0.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
if (openFileDialog1.ShowDialog() == DialogResult.OK) //открылось ли окно диалога
            {
                try
                {
                    if ((oStream = openFileDialog1.OpenFile()) != null) //попробовать: НЕ отсутствует ли файл
                    {
                        using (oStream)                     //пользуем имя файла
                        {
                            lblFile.Text = openFileDialog1.FileName;
                            tbfile.Text = File.ReadAllText(openFileDialog1.FileName);
                            string[] s = File.ReadAllLines(openFileDialog1.FileName);
                            double[,] mat = new double[s.Length,2];
                            for (int i = 0; i < s.Length; i++)
                            {
                                for (int j = 0; j < 2; j++)
                                {
                                    mat[i, j] = (double)char.GetNumericValue(s[i][j]);
                                }
                           }  
                        }
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message);
                }
0
868 / 718 / 304
Регистрация: 15.04.2013
Сообщений: 2,047
Записей в блоге: 5
06.07.2015, 17:39 6
ToLexx,
Если вы не покажете водные данные т.е. как числа записаны в файле вам и не смогут помочь. Покажите пример файла
0
3 / 3 / 2
Регистрация: 21.10.2013
Сообщений: 209
07.07.2015, 14:50  [ТС] 7
Простите думал достаточно будет описательно, соответственно часть массива:
Oscilloscope Data File
Experiment Time : 20-05-2015 13:53:17
Number of frames: 50000

Module: L-502 (3D867743)

Number Of Channels : 2
Input Rate In kHz: 10.000000
Input Time In Sec: 5.000000
Decimation: 1
Data Format: Volts
GPS time=00:00:00 00-00-0000
GPS latitude=, latitude h=0
GPS longitude=, longitude h=0
Segments: 1
Data as Time Sequence:
Ch 1 Ch 2
Ustol Udus

-0.075 0.754
-0.102 0.751
-0.101 0.763
-0.125 0.770
-0.148 0.742
-0.174 0.728
-0.201 0.756
-0.200 0.720
-0.227 0.728
-0.246 0.769
-0.273 0.754
-0.290 0.768
-0.297 0.749
-0.319 0.738
-0.340 0.810

Добавлено через 17 минут
Кстати хотел ещё вопрос задать про свойство openfiledialog1.InitialDirectory. Получается если я ставлю чёткий адрес, прога ищет его и если таковой есть открывает иначе ошибка. А вот если ставлю пустой адрес то бишь:
C#
1
openFileDialog1.InitialDirectory = "";
У меня открылась папка откуда я в прошлый раз открывал(папка была вообще на флешке). Так всегда будет??? Т.е. один раз открыл в другом месте, он запомнил и в следующий раз открывает именно эту папку, пока опять не изменишь путь при следующем открывании файла???

Добавлено через 4 часа 38 минут
тишина..... и только мёртвые с косами стоят..
УУУУУУУУУУ-УУУУ-уууу-уу

Добавлено через 6 минут
я воспользовался readAllLines, получил массив строк. Теперь пытаюсь через циклы этот массив передать массиву типа double:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
 
string[] 
str = File.ReadAllLines(openFileDialog1.FileName);
  for (int i = 0; i <= str.Length; i++)
  {
     if (i > 19)
     {
        for (int j = 0; j < 2; j++)
        {
           mat1[j] = Convert.ToDouble(str[i].Split(' '));
        }
     }
}
В ответ программа постоянно выскакивает в Exception типа
"Не удалось привести тип объекта string[] к типу IConvertable" суть исключения понимаю, но каким боком обойти эту хрень хоть убейте.
Попробовал split-ом разделить 2 числа из строки массива и уже так передать опять получилась уже крит.ошибка.
заранее спасибо!
0
868 / 718 / 304
Регистрация: 15.04.2013
Сообщений: 2,047
Записей в блоге: 5
07.07.2015, 14:57 8
ToLexx,
Если у файла такая структура как вы предоставили, то вот решение, конечно тут нет никаких проверок, вам необходимо только передать путь к файлу
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        public static Tuple<double, double>[] ReadArray(string path)
        {
            var lines = File.ReadAllLines(path).Skip(19);
 
            var list = new List<Tuple<double, double>>();
 
            foreach (var line in lines)
            {
                string[] split = line.Split(' ');
 
                var first = Double.Parse(split[0]);
                var second = Double.Parse(split[1]);
 
                list.Add(new Tuple<double,double>(first, second));
            }
 
            return list.ToArray();
        }
1
3 / 3 / 2
Регистрация: 21.10.2013
Сообщений: 209
07.07.2015, 15:42  [ТС] 9
XROY, простите я немного не в теме вами написанного.
Вы создаёте метод ReadArray, с возвращаемым значением типа кортеж из 2х элементов типа <double, double> - 1строка.
Так не? А как же потом обрабатывать эти значения.

неясно 11, 12, 14 строки.
и почему используете тип var? из-за того что значения файла смешанные типы. Сейчас пока читаю msdn, но всё равно не воткнул пока.

И ещё вопрос: неужели никак нельзя просто передать массив строк в массив чисел?!
Ведь ReadAllLines я фактически получил этот массив. Потом пытался просто преобразовать convert.double(строка(i).split(' '));
Попробовал вариант передачи простой строке строки из массива, и уже строку очистить от ' ' и сконвертировать в double.
Просто вы пользуетесь достаточно сложным методом, вот и спрашиваю
А если бы в моём массиве было бы не 2 столбца, а 20. Там же воникли бы некоторые проблемы с кортежами или я неправ?
0
868 / 718 / 304
Регистрация: 15.04.2013
Сообщений: 2,047
Записей в блоге: 5
08.07.2015, 20:30 10
ToLexx,
Если вам нужен массив вместо кортежа ничего особо не поменяется
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        public static double[,] ReadArray(string path)
        {
            var lines = File.ReadAllLines(path).Skip(19).ToList();
            var numbersInRow = 2;
 
            double[,] array = new double[lines.Count(), numbersInRow];
 
            for (int i = 0; i < lines.Count; i++)
            {
                string[] split = lines[i].Split(' ');
 
                for (int j = 0; j < numbersInRow; j++)
                {
                    array[i, j] = Double.Parse(split[0]);
                }
            }
 
            return array;
        }
Добавлено через 3 минуты
Цитата Сообщение от ToLexx Посмотреть сообщение
и почему используете тип var?
var указывает, что тип будет подставлен компилятором, это всего лишь синтаксический сахар

Цитата Сообщение от ToLexx Посмотреть сообщение
неужели никак нельзя просто передать массив строк в массив чисел?!
Ведь ReadAllLines я фактически получил этот массив. Потом пытался просто преобразовать convert.double(строка(i).split(' '))
Нельзя
Этот метод принимает строку, а не ее массив.

Цитата Сообщение от ToLexx Посмотреть сообщение
А если бы в моём массиве было бы не 2 столбца, а 20. Там же возникли бы некоторые проблемы с кортежами или я неправ?
Кортеж состоит максимум из 7 элементов
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.07.2015, 20:30

Чтение файла, представление его в двоичном виде
Здравствуйте, подскажите пожалуйста .Я представлял картинку в двоичном виде , делал шифрование LSFR...

Чтение массива из файла в TextBox
Подскажите, пожалуйста, как считать массив из фала в TextBox

Сохранение и чтение динамического массива из файла
Доброго времени суток, у меня есть динамический массив Tother=record i:integer; a:byte; end;...

Сохранение массива в файл и чтение массива из файла
Имеется массив: int region_coordinates; Надо его записать в файл(неважно, в каком формате,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru