powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Запись в строковый массив
30 сообщений из 30, показаны все 2 страниц
Запись в строковый массив
    #38512881
XXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Подскажите, пожалуйста, как реализовать следующее:

У меня есть текстовый файл .tmp с данными. Мне нужно записать в строковый массив не все данные, а лишь определенные (я выделила их красным цветом на скриншоте).
Сами данные могут меняться, а их позиции остаются постоянными.
На скриншоте я привела один фрагмент текста за одну дату, но таких фрагментов может быть несколько для разных дат и везде нужно вытащить цифры в заданных позициях.
автор


Заранее большое спасибо:)
...
Рейтинг: 0 / 0
Запись в строковый массив
    #38513238
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А в чем проблема? Как вы попытались решить задачу?
...
Рейтинг: 0 / 0
Запись в строковый массив
    #38513266
XXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79,
Мне нужно зачитать метеофайл с текстовыми данными, из которых нужно положить в строковый массив определенные данные, выделенные на скриншоте красным цветом. Потом планирую дописать эти данные в существующий датасет.
...
Рейтинг: 0 / 0
Запись в строковый массив
    #38513291
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прекрасно

Как вы собираетесь читать файл с текстовыми данными? Существует куча разных интересных способов.
Далее, при считывании как вы думаете, как можно перейти к нужной строке и столбцам?
...
Рейтинг: 0 / 0
Запись в строковый массив
    #38513307
XXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79Прекрасно

Как вы собираетесь читать файл с текстовыми данными? Существует куча разных интересных способов.
Далее, при считывании как вы думаете, как можно перейти к нужной строке и столбцам?

Я файл считала и записала в строковый массив.

Код: c#
1.
2.
private string[] stArray;
stArray = File.ReadAllLines(OPF.FileName, System.Text.Encoding.GetEncoding(1251));



Выводила в TextBox, все правильно читает. А вот как перейти к нужной строке и столбцам не знаю.
...
Рейтинг: 0 / 0
Запись в строковый массив
    #38513311
XXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
OpenFileDialog OPF = new OpenFileDialog();
            OPF.Filter = "Файлы tmp|*.tmp";
            if (OPF.ShowDialog() == DialogResult.OK)
            {
 
                StreamReader streamReader = new StreamReader(OPF.FileName, System.Text.Encoding.GetEncoding(1251)); 
                string str = "";
                while (!streamReader.EndOfStream) 
                {
                    str += streamReader.ReadLine();
                }

                textBox1.Text = str;
              
                stArray = File.ReadAllLines(OPF.FileName, System.Text.Encoding.GetEncoding(1251));
 
...
Рейтинг: 0 / 0
Запись в строковый массив
    #38513319
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) string[] lines
2) string[] columns = lines[нужная строка].Split(" ")
3) console.writeline("{0} {1} ... ", columns[1], columns[2], ...)
...
Рейтинг: 0 / 0
Запись в строковый массив
    #38513340
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XXL
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
OpenFileDialog OPF = new OpenFileDialog();
            OPF.Filter = "Файлы tmp|*.tmp";
            if (OPF.ShowDialog() == DialogResult.OK)
            {
 
                StreamReader streamReader = new StreamReader(OPF.FileName, System.Text.Encoding.GetEncoding(1251)); 
                string str = "";
                while (!streamReader.EndOfStream) 
                {
                    str += streamReader.ReadLine();
                }

                textBox1.Text = str;
              
                stArray = File.ReadAllLines(OPF.FileName, System.Text.Encoding.GetEncoding(1251));
 



Это не код, а ужас.

1) зачем каждый раз присваивать str новое значение? это накладно
2) для присвоения TextBox значения не надо читать построчно. Откройте для себя метод ReadToEnd()
3) в stArray не нужно повторно читать файл. Два раза обращаетесь к файлу - медленно.
4) у TextBox разве нет свойства типа Items или Lines или как то похоже? Это массив строк
...
Рейтинг: 0 / 0
Запись в строковый массив
    #38513702
XXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79,

С чтением массива разобралась. Теперь мне нужно записать его в DataTable. Как это сделать? Это не совсем понятно. Как выбрать нужные значения из массива и записать в DataTable.
Допустим, имеется структура:

Код: 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.
DataTable adotableTextArray = new System.Data.DataTable("TextArray");

 column = new DataColumn();
            column.DataType = Type.GetType("System.Int32");
            column.ColumnName = "ID";
            adotableTextArray.Columns.Add(column);

            column = new DataColumn();
            column.DataType = Type.GetType("System.String");
            column.ColumnName = "Year";
            adotableTextArray.Columns.Add(column);

            column = new DataColumn();
            column.DataType = Type.GetType("System.String");
            column.ColumnName = "Month";
            adotableTextArray.Columns.Add(column);

            column = new DataColumn();
            column.DataType = Type.GetType("System.String");
            column.ColumnName = "date";
            adotableTextArray.Columns.Add(column);

            column = new DataColumn();
            column.DataType = Type.GetType("System.Int32");
            column.ColumnName = "hour";
            adotableTextArray.Columns.Add(column);

            column = new DataColumn();
            column.DataType = Type.GetType("System.String");
            column.ColumnName = "atmpressure";
            adotableTextArray.Columns.Add(column);

            column = new DataColumn();
            column.DataType = Type.GetType("System.String");
            column.ColumnName = "WindNapr";
            adotableTextArray.Columns.Add(column);
...
Рейтинг: 0 / 0
Запись в строковый массив
    #38513706
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
Type.GetType("System.Int32")


Что это за жесть?
...
Рейтинг: 0 / 0
Запись в строковый массив
    #38513712
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XXLТеперь мне нужно записать его в DataTable

Самая первая ссылочка , ведущая в MSDN

Девушка, постарайтесь предварительно самой поискать ответы на простые вопросы.

ЗЫ Без фото на детские вопросы отвечать не буду :-)
ЗЗЫ Не надо Type.GetType. typeof(int), typeof(string) получше будут
...
Рейтинг: 0 / 0
Запись в строковый массив
    #38513927
XXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79XXLТеперь мне нужно записать его в DataTable

Самая первая ссылочка , ведущая в MSDN

Девушка, постарайтесь предварительно самой поискать ответы на простые вопросы.

ЗЫ Без фото на детские вопросы отвечать не буду :-)
ЗЗЫ Не надо Type.GetType. typeof(int), typeof(string) получше будут

Как записывать в DataTable я прекрасно знаю и вышеуказанная ссылка мне не нужна.
С массивами столкнулась впервые и не совсем ясно как выбрать именно нужные значения из массива. Не хотите отвечать и не надо. Разберусь.
...
Рейтинг: 0 / 0
Запись в строковый массив
    #38513943
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XXLкак выбрать именно нужные значения из массива

Девушка, что из нижеприведенного было непонятно в плане выборки?
Arm791) string[] lines
2) string[] columns = lines[нужная строка].Split(" ")
3) console.writeline("{0} {1} ... ", columns[1], columns[2], ...)
...
Рейтинг: 0 / 0
Запись в строковый массив
    #38513961
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выборка из массива:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
            string[] stArray = new string[]
                {
                    "фамилия семестр1 семестр2",
                    "Arm79 5 5",
                    "XXL 3 3"
                };

            string[] myAssessment = stArray[1].Split(new string[] {" "}, StringSplitOptions.None);
            Console.WriteLine("{0} - {1}", myAssessment[1], myAssessment[2]);


            string[] xxlAssessment = stArray[2].Split(new string[] { " " }, StringSplitOptions.None);
            Console.WriteLine("{0} - {1}", xxlAssessment[1], xxlAssessment[2]);

            Console.ReadLine();
...
Рейтинг: 0 / 0
Запись в строковый массив
    #38514033
XXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79Выборка из массива:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
            string[] stArray = new string[]
                {
                    "фамилия семестр1 семестр2",
                    "Arm79 5 5",
                    "XXL 3 3"
                };

            string[] myAssessment = stArray[1].Split(new string[] {" "}, StringSplitOptions.None);
            Console.WriteLine("{0} - {1}", myAssessment[1], myAssessment[2]);


            string[] xxlAssessment = stArray[2].Split(new string[] { " " }, StringSplitOptions.None);
            Console.WriteLine("{0} - {1}", xxlAssessment[1], xxlAssessment[2]);

            Console.ReadLine();


Спасибо. В случае консольного приложения у меня получилась выборка.
Но у меня Win приложение. Как написать в этом случае выводящую строку?
Например, вместо Console.WriteLine("{0} - {1}", myAssessment[1], myAssessment[2]);
...
Рейтинг: 0 / 0
Запись в строковый массив
    #38514048
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XXLКак написать в этом случае выводящую строку?
а куда вам нужно выводить?

посмотрите на String.Format("{0} - {1}", xxlAssessment[1], xxlAssessment[2]). Выводит строку, которую можно писать куда угодно
...
Рейтинг: 0 / 0
Запись в строковый массив
    #38514052
Syrex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
textBox.AppendText(string.Format("{0} - {1}", xxlAssessment[1], xxlAssessment[2]));
...
Рейтинг: 0 / 0
Запись в строковый массив
    #38514092
XXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо
...
Рейтинг: 0 / 0
Запись в строковый массив
    #38515332
XXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще вопрос.
Я записала данные в ArrayList.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
 StreamReader objReader = new StreamReader("D:\\1.tmp");
            string sLine = "";
            arrText = new ArrayList();
            while (sLine != null)
            {
                sLine = objReader.ReadLine();
                if (sLine != null)
                    arrText.Add(sLine);
            }
            objReader.Close();

PrintIndexAndValues(arrText);

      private void PrintIndexAndValues(IEnumerable myList)
        {
            int i = 0;
            foreach (Object obj in myList)
            {
                MessageBox.Show(string.Format("{1}", i++, obj).ToString());
            }
        }


В сообщении у меня сейчас выводится информация по всей строке.
А мне нужно выбрать числа в определенных позициях.
Например, как на скриншоте:
автор

Не знаю, как задать в этом случае номер строки и позицию числа.
Вместо числа 23 может быть любое число, важно чтобы оно находилось, например, в первой строке и на третьем месте.
Если кто подскажет, буду очень благодарна.
...
Рейтинг: 0 / 0
Запись в строковый массив
    #38515367
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XXLЯ записала данные в ArrayList
Почему ArrayList? он же типизированный

XXL
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 StreamReader objReader = new StreamReader("D:\\1.tmp");
            string sLine = "";
            arrText = new ArrayList();
            while (sLine != null)
            {
                sLine = objReader.ReadLine();
                if (sLine != null)
                    arrText.Add(sLine);
            }
            objReader.Close();



Вышеуказанный код заменяется всего одной строчкой: string[] arrText = File.ReadAllLines("D:\\1.tmp");

XXLнапример, в первой строке и на третьем месте.
string[] stValues = arrText[0].Split(new string[] {здесь тот разделитель, что у вас между значениями. не пойму, пробел там или \t или еще что}, StringSplitOptions.None)
Console.WriteLine(strValue[2])

0 и 2 вместо 1 и 3 потому что отсчет позиции в массиве идет от нуля.

ЗЫ Вы бы не картинку, а сам файл приложили
...
Рейтинг: 0 / 0
Запись в строковый массив
    #38515374
XXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79ЗЫ Вы бы не картинку, а сам файл приложили
Прикладываю файл.
Считывать мне нужно данные как в первом посте: из строки1 и из строки 9. Проблема в том, что таких строк может быть много.
...
Рейтинг: 0 / 0
Запись в строковый массив
    #38515383
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XXLиз строки1 и из строки 9. Проблема в том, что таких строк может быть много

Что значит много? вам нужны строки, где первое поле имеет значение 1 или 9? Или вам по индексу нужно?
...
Рейтинг: 0 / 0
Запись в строковый массив
    #38515394
XXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79XXLиз строки1 и из строки 9. Проблема в том, что таких строк может быть много

Что значит много? вам нужны строки, где первое поле имеет значение 1 или 9? Или вам по индексу нужно?

Читать значения нужно из всех строк с индексом 1 и с индексом 9 по всему файлу.
Например, в прилагаемом файле:

1. 254 12 23 дек 2012
где нужно прочитать и записать в переменную каждое из значений: 12 (час), 23 (дата), дек (месяц), 2012 (год)
..................................................................................
9. 1013 156 195 275 90 10
где нужно прочитать и записать в переменную каждое из значений:
1013 (давление), 156 (высота), 195 температура, -275 (точка росы), 90 (направление ветра), 10 (скорость ветра).
Это все значения за определенную дату, указанную в строке 1.
..........................
Далее идет другая дата 24 декабря 2012. Для нее точно также нужно вытащить значения в строках 1 и 9.
и так для всех имеющихся дат.

Эти значения я потом буду дописывать в имеющийся датасет для определенных дат.
...
Рейтинг: 0 / 0
Запись в строковый массив
    #38515424
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XXLЧитать значения нужно из всех строк с индексом 1 и с индексом 9 по всему файлу.
Непонятно. Допустим, строка 1 - это дата. Почему строка 9 у вас 6 по списку? Вы определитесь, выбирать по значению первого поля или по номеру строки после даты
...
Рейтинг: 0 / 0
Запись в строковый массив
    #38515428
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
    class Program
    {
        static void Main(string[] args)
        {
            Console.WindowWidth = 150;
            Console.BufferHeight = 10000;

            const string filePath = @"C:\Users\Arm79\Downloads\файл\файл\1.tmp";

            // показания сгруппированы по дням, признак дня - значение 254
            // по умолчанию будет текущий (это по логике неправильно, зато код стройный и красивый)
            var currentMoment = DateTime.Now;
            var rows = new List<KeyValuePair<DateTime, List<string>>>();

            // 1) Parsing
            foreach (var line in File.ReadLines(filePath))
            {
                var currentRow = line;

                // за исключением строки с датой все остальные строки имеют на поле всего 7 символов. Номер строки с датой тоже подчиняется этому правилу
                List<string> columns;
                if (line.Substring(0, 7).Trim() == ("254"))    
                {
                    columns = currentRow.Split(new char[] {' '}, StringSplitOptions.RemoveEmptyEntries).ToList();
                    currentMoment = DateTime.ParseExact(String.Format("{0} {1} {2}", columns[2], columns[3], columns[4]), "d MMM yyyy", new CultureInfo("en-US"));
                }
                else
                {
                    columns = SplitToList(currentRow);
                }

                rows.Add(new KeyValuePair<DateTime, List<string>>(currentMoment, columns));
            }

            // 2) Selecting
            var dateTimes = rows.Select(r => r.Key).Distinct();
            foreach (DateTime dateTime in dateTimes)
            {
                var keyValuePairs = rows.SkipWhile(r => r.Key != dateTime).TakeWhile(r => r.Key == dateTime).ToArray();
                Console.WriteLine(String.Join(" ", keyValuePairs[0].Value));
                Console.WriteLine(String.Join(" ", keyValuePairs[4].Value));
            }

            Console.ReadLine();
        }

        private static List<string> SplitToList(string stringRow)
        {
            var result = new List<string>();

            var index = 0;
            while (index != stringRow.Length)
            {
                string currentValue = stringRow.Substring(index, 7);
             
                // Тут сложность, N и E попадают в другое поле, а относятся к предыдущему. Исправляем несправедливость во имя Луны!
                if (currentValue.StartsWith("N") || currentValue.StartsWith("E"))
                {
                    result[result.Count - 1] += currentValue[0];
                    currentValue = currentValue.Remove(0, 1);
                }

                result.Add(currentValue);
                index = index + 7;
            }

            return result;
        }
    }
...
Рейтинг: 0 / 0
Запись в строковый массив
    #38515430
XXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79XXLЧитать значения нужно из всех строк с индексом 1 и с индексом 9 по всему файлу.
Непонятно. Допустим, строка 1 - это дата. Почему строка 9 у вас 6 по списку? Вы определитесь, выбирать по значению первого поля или по номеру строки после даты

выбирать по значению первого поля
...
Рейтинг: 0 / 0
Запись в строковый массив
    #38515448
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XXLвыбирать по значению первого поля
По первому полю у вас дата, и там 254. Так что никак по значению не взять

Вот вариант для поиска девятки в определенной дате. Замените код:
Код: c#
1.
2.
3.
                //Console.WriteLine(String.Join(" ", keyValuePairs[4].Value));
                KeyValuePair<DateTime, List<string>> nullableValue = keyValuePairs.FirstOrDefault(p => p.Value[0].Trim() == "9");
                Console.WriteLine(String.Join(" ", nullableValue.Value ?? new List<string>(new[] {"Empty"})));
...
Рейтинг: 0 / 0
Запись в строковый массив
    #38515451
XXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79
Код: 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.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
    class Program
    {
        static void Main(string[] args)
        {
            Console.WindowWidth = 150;
            Console.BufferHeight = 10000;

            const string filePath = @"C:\Users\Arm79\Downloads\файл\файл\1.tmp";

            // показания сгруппированы по дням, признак дня - значение 254
            // по умолчанию будет текущий (это по логике неправильно, зато код стройный и красивый)
            var currentMoment = DateTime.Now;
            var rows = new List<KeyValuePair<DateTime, List<string>>>();

            // 1) Parsing
            foreach (var line in File.ReadLines(filePath))
            {
                var currentRow = line;

                // за исключением строки с датой все остальные строки имеют на поле всего 7 символов. Номер строки с датой тоже подчиняется этому правилу
                List<string> columns;
                if (line.Substring(0, 7).Trim() == ("254"))    
                {
                    columns = currentRow.Split(new char[] {' '}, StringSplitOptions.RemoveEmptyEntries).ToList();
                    currentMoment = DateTime.ParseExact(String.Format("{0} {1} {2}", columns[2], columns[3], columns[4]), "d MMM yyyy", new CultureInfo("en-US"));
                }
                else
                {
                    columns = SplitToList(currentRow);
                }

                rows.Add(new KeyValuePair<DateTime, List<string>>(currentMoment, columns));
            }

            // 2) Selecting
            var dateTimes = rows.Select(r => r.Key).Distinct();
            foreach (DateTime dateTime in dateTimes)
            {
                var keyValuePairs = rows.SkipWhile(r => r.Key != dateTime).TakeWhile(r => r.Key == dateTime).ToArray();
                Console.WriteLine(String.Join(" ", keyValuePairs[0].Value));
                Console.WriteLine(String.Join(" ", keyValuePairs[4].Value));
            }

            Console.ReadLine();
        }

        private static List<string> SplitToList(string stringRow)
        {
            var result = new List<string>();

            var index = 0;
            while (index != stringRow.Length)
            {
                string currentValue = stringRow.Substring(index, 7);
             
                // Тут сложность, N и E попадают в другое поле, а относятся к предыдущему. Исправляем несправедливость во имя Луны!
                if (currentValue.StartsWith("N") || currentValue.StartsWith("E"))
                {
                    result[result.Count - 1] += currentValue[0];
                    currentValue = currentValue.Remove(0, 1);
                }

                result.Add(currentValue);
                index = index + 7;
            }

            return result;
        }
    }



Выдает мне ошибку:
автор
...
Рейтинг: 0 / 0
Запись в строковый массив
    #38515453
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у меня работает
...
Рейтинг: 0 / 0
Запись в строковый массив
    #38515463
XXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо
...
Рейтинг: 0 / 0
30 сообщений из 30, показаны все 2 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Запись в строковый массив
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]