Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.92/25: Рейтинг темы: голосов - 25, средняя оценка - 4.92
 Аватар для PierL
4 / 4 / 0
Регистрация: 18.07.2013
Сообщений: 382

Распарсить файл и записать результаты в массив

10.04.2014, 15:37. Показов 5633. Ответов 46
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ребята, подмогите пожалуйста.

У меня Текстовый файл.txt.
Первые две строки Заглавие
Потом идут числовые значения через TAB #13
Пример файла, после первых двух строк:

Code
1
2
3
4
5
10     24     45      13     10     10,8     41,1     47,8   2,54     0,024
13     32     65      37     21     1,3      34,5     47,8   1,55     0,022
12     24     45      13     10     10,8     41,1     47,8   4,54     0,024
15     24     45      13     10     10,8     41,1     47,8   3,25     0,024
32     24     45      13     10     10,8     41,1     47,8   1,48     0,024
Все строки разные и их много до 300000 и иногда более.

ВОПРОС: КАК МНЕ ИЗ СТРОКИ БРАТЬ ЗНАЧЕНИЯ? ДОПУСТИМ, ДЕВЯТОЕ ЗНАЧЕНИЕ 2,54 ИЗ ПЕРВОЙ СТРОКИ СРАВНИТЬ С ДЕВЯТЫМ ИЗ ВТОРОЙ 1,55.
Читал про TString and TStringList, там как-то сжато. Про выкарчевывание символов из строки нет...
Спасибо всем.

Добавлено через 21 минуту
ОПЕРАТИВНАЯ ПАМЯТЬ
В цикле заполняется StringGrid (17 строк), при количестве колонок более 100000 не хватает оперативной памяти на моем каличе и жутко начинает виснуть всё на свете.
Как мне сохранять в тектовый файл данные и чтоб после каждой строчки оперативка очищалась или как нибудь по другому?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.04.2014, 15:37
Ответы с готовыми решениями:

Распарсить текстовый файл и записать все числа в массив
Вообщем, есть txt файл, например, типа: бла бла бла бла 1333.78 бла бла (1 строка) бла бла бла бла 7856.55 бла бла (2 строка) ...

Распарсить текст и записать результаты в таблицу
Вообщем в Qt новичок, есть текст, ищу параметры после их названия( т.е. ищу цифры после слова) и кидаю их в таблицу. Пока написал поиск...

Распарсить один RichTextBox и записать результаты во второй
Всем доброго времени суток.. Подскажите как распарсить Richtextbox и получить все значения которые заключены например...

46
14.04.2014, 13:34
Студворк — интернет-сервис помощи студентам

Не по теме:

Цитата Сообщение от northener Посмотреть сообщение
Фигня запишется в такой файл.
У кого как...

0
14.04.2014, 13:43

Не по теме:

Цитата Сообщение от Puporev Посмотреть сообщение
У кого как...
Ну разве если кто пишет на Д1 до сих пор, тогда верю.

0
 Аватар для PierL
4 / 4 / 0
Регистрация: 18.07.2013
Сообщений: 382
14.04.2014, 13:56  [ТС]
где же истина (True)?
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
14.04.2014, 19:34
Сложновато мне понять твои описания. Ну, пробежавшись по твоим темам попытаюсь воссоздать технологию вычислений.

1. Ты составляешь все сочетания целых чисел, дающих в сумме 100.
2. Загоняешь очередное сочетание в Excel для того, чтобы получить какие-то результаты. Не буду ставить под сомнение сам смысл данного хода - видимо в Дэлфи этого нельзя сделать.
3. Выбираешь из Excel-а полученный результат. Сколько же этих результирующих чисел должно быть? Раньше речь шла о 16 значениях в строке, сейчас о 18-ти?
4. Вставляешь их в строку (или столбец?) StringGrid-а. Предположу что в столбец.
И так все эти 4 пункта должны повторяться пока не будут перебраны все сочетания/ комбинации.
После этого ты хочешь иметь возможность сортировать эти столбцы в StringGrid-е и дать пользователю возможность, как минимум, их просматривать.
Грубо прикидывая, таких сочетаний может быть примерно 90^10. Если брать только 6 результирующих чисел и по 10 байт на каждое - это будет 90^10*60 байт. 2092070640600 Гб. Что то у меня слишком много получилось. Видимо рассуждения неверны.
В любом случае накопление результатов стоит делать в файле. Стоит ли сохранять значения перебора? Эти первые 11 чисел. Это ведь существенная добавка. Может уже можно обойтись и без них? Тем более в StringGrid-е.
Ну да ладно. Типизированный файл для твоего случая будет выглядеть так:
Delphi
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
TZap = Record
  ZnPer : Array[1..11] Of Integer;
  Res : Array[12..18] Of Single; //Если тебе хватит 7-8 десятичных знаков - можно обойтись Single (4 б)
           End;
 
Var
  f : File Of TZap;
  Zap : TZap; //Это переменная в которую будут считываться твои данные
 
Begin
  AssignFile(f,'MyFile.dat');
  Rewrite(f); //Или Reset
  While Not Eof(f) Do //Проверка на конец файла
Begin
  //Читаем запись
  Read(f,Zap); //Указатель в файле сдвинулся на след. запись
  //Обращаемся к данным считанной записи
  Zap.ZnPer[1] //Это к одному 1-му элементу массива
  Zap.Res[12] //Это к одному 12-му элементу массива результатов
  //Записываем запись в файл - по текущему указателю положения в файле
  Write(f,Zap); //Предварительно в Zap нужно сложить все данные, которые будут сохраняться
  Seek(f,FilePos(f)-1); //Смещаем указатель на одну запись к началу файла
  Seek(f,125); //Смещаем указатель на 125-ю запись в файле (ну и т.п.)
End;
  CloseFile(f);
End;
Примерно так.
С выборкой из файла, надеюсь, понятно. Теперь если хочешь листать данные файла через StringGrid предлагаю вариант с обработкой клавиш управления. PgUp, PgDown и т.п. Просто запоминать текущущее положение в файле и при нажатии одной из этих клавиш, выдавать соответственно предыдущие несколько записей или следующие. Не забывая предварительно переместить указатель на первую из нужных.

Вот с сортировкой сложнее. При таких объёмах данных, как я посчитал - простыми методами не обойтись. Но если их меньше - загружать все данные в массив, сортировать массив и опять выгружать в файл.
1
 Аватар для PierL
4 / 4 / 0
Регистрация: 18.07.2013
Сообщений: 382
15.04.2014, 15:39  [ТС]
Цитата Сообщение от Одиночка Посмотреть сообщение
1. Ты составляешь все сочетания целых чисел, дающих в сумме 100.
Совершенно верно, всего 10 чисел перебираю (каждое в своем диапазоне Например одно число от 1..20, второе от 5..9, в абсолютно в разных диапазонах. По первым испытаниям, думаю, максимальное количество переборов будет до 600000), сумма которых равна 100. Потом с этими десятью числами работаю в Excell'е.

Цитата Сообщение от Одиночка Посмотреть сообщение
видимо в Дэлфи этого нельзя сделать.
Позже буду переводить на Delphi, это на пол года работы наверно будет, потому что один батрачу, если кто подскажет, так это ребята с форума, т.е. вы. Думаю что в коде работать будет гораздо быстрее.

Цитата Сообщение от Одиночка Посмотреть сообщение
16 значениях в строке, сейчас о 18-ти
Эти числа я добавляю из Excell. (Т.е. еще раз объясню: первые десять чисел - перебор, 11 - сумма (100, я его оставляю для успокоения души т.Зины), остальные числа из Excell'а, это результат переборной комбинации, чтоб наглядней было анализировать данные. может еще попросят добавить, но это уже не важно)
Цитата Сообщение от Одиночка Посмотреть сообщение
Грубо прикидывая, таких сочетаний может быть примерно 90^10.
Сочетаний до 600000 (За счет узких диапазонов).

Добавлено через 6 часов 57 минут
Цитата Сообщение от Puporev Посмотреть сообщение
В типизированном файле нет строк. Там хранятся компоненты, например записи с набором полей.
Читаешь запись и берешь данные из нужного поля, например такой тип записи
Puporev, не подскажешь, есть ли с типизированным файлом хороший пример? Чтоб понять. пример, где записал пару строк, и нужное данное прочитал из любой строки. Типа такого. Чтоб врубиться, я честно говоря сейчас в ступоре, что там в файл записывается? Не понимаю. Спасибо!
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
16.04.2014, 06:34
PierL, Если у тебя будет примерно 600000 таких строк записей тогда, в принципе это всё можно обрабатывать в памяти. Ещё раз повторяю: записывай всё в массив и работай с данными в массиве. И не нужно их в файл выгружать. Только массив объявляй как динамический, тогда он будет храниться в динамической памяти. Массив с элементами в виде твоих записей данных. Вот так:
Delphi
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
Type
TZap = Record
  ZnPer : Array[1..11] Of Byte; //Для значений до 100 хватит типа Byte (1х11 b)
  Res : Array[12..18] Of Single; //Если тебе хватит 7-8 десятичных знаков - можно обойтись Single (4х6 б)
           End; //Итого 35x600000 б = 21000000 20 Mб
Var
  MyArr : Array Of TZap;
  Tmp : TZap;
Begin
  //Определяем размер массива...
  SetLength(MyArr,600000); //Индексация в таком массиве с 0
  //Заполнение массива... (пример)
  MyArr[0].ZnPer[1]:=10;
  MyArr[0].ZnPer[2]:=15;
  MyArr[0].ZnPer[3]:=21;
...
  MyArr[0].Res[12]:=0,61;
  MyArr[0].Res[13]:=1,25;
...
 
  //Сортировка по какому-то значению... (пример)
  For i:=0 To High(MyArr)-1 Do
  For j:=1 To High(MyArr) Do
  If MyArr[i].Res[3]>MyArr[j].Res[3] Then
  Begin
    Tmp:=MyArr[i];
    MyArr[i]:=MyArr[j];
    MyArr[j]:=Tmp;
  End; //Это только пример сравнения и обмена значениями элементов массива, но не реальная сортировка
 
  //Выдача с StringGrid (допустим очередные 20 строк в столбцы грида)
  PosInArr:=50; //Это с какой позиции в массиве выдаём (лучше эту переменную сделать глобальной)  
  For i:=PosInArr To PosInArr+19 Do
  Begin
    For j:=1 To 11 Do
    StringGrid1.Cells[i-PosInArr,j]:=IntToStr(MyArr[i].ZnPer[j]);
    For j:=12 To 18 Do
    StringGrid1.Cells[i-PosInArr,j]:=FloatToStr(MyArr[i].Res[j]);
  End;
 
  //Освобождаем память массива при закрытии программы
  Finalize(MyArr);
End;
Примерно так. Заполнить массив. Сделать сортировку по клику определённой кнопки. Где-то задавать по какому индексу сортировать. Кликнули, отсортировал по нужному индексу и выдал часть на экран в грид. Нажали PgDown или PgUp - выдал очередную порцию в грид. Листаем, просматриваем. Ну и так далее.

Я же тебе пример работы с типизированным файлом написал. Посмотри внимательней. Там и комментарии есть. Со структурированной переменной типа TZap работать так же как и в примере с массивом. Когда записываешь или читаешь в (из) неё данные из файла - пишется (читается) сразу вся запись. Можешь писать (читать) в массив:
Delphi
1
2
3
4
5
6
7
8
9
10
Begin
  i:=0;
  While Not Eof(f) Do //Проверка на конец файла
  Begin
    //Читаем запись
    Read(f,MyArr[i]);
    Inc(i);
  End;
  CloseFile(f);
End;
Так же писать:
Delphi
1
2
3
4
5
6
7
8
Begin
  For i:=0 To High(MyArr) Do
  Begin
    //Читаем запись
    Write(f,MyArr[i]);
  End;
  CloseFile(f);
End;
0
 Аватар для PierL
4 / 4 / 0
Регистрация: 18.07.2013
Сообщений: 382
18.04.2014, 08:35  [ТС]
Цитата Сообщение от Одиночка Посмотреть сообщение
Finalize(MyArr);
Как это осуществить?
извините, что так туплю!

Добавлено через 8 минут
Это получается?
Delphi
1
MyArr:=nil;
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
18.04.2014, 19:03
Так и пишешь команду:
Delphi
1
Finalize(MyArr);
Компилятор сам создаст команды для освобождения динамической памяти, выделенной под массив. А
Delphi
1
MyArr:=nil;
это не совсем то. Ты только ссылку на адрес массива удалишь. А пямять останется отмеченной что занята. И будет у тебя утечка памяти при каждом запуске программы.
Можно ещё сделать:
Delphi
1
SetLength(MyArr,0);
Лучше почитай тему о динамических массивах: Динамические массивы в Delphi
1
 Аватар для PierL
4 / 4 / 0
Регистрация: 18.07.2013
Сообщений: 382
23.04.2014, 16:24  [ТС]
Цитата Сообщение от Одиночка Посмотреть сообщение
....
Одиночка и ребята, посмотрите пожалуйста код программки, где я в стринг грид выдаю массив по нажатию кнопок.

Суть программы (программа для понимания), создаю массивы в SG1, считываю их в массив MyArr.
Потом записываю массив в MoyFile.dat.
Считываю этот файл в Мемо1.
Потом вывожу массив в SG2 в столбик, по частям, по нажатию кнопки передвигаюсь по массиву.
Вот в передвижении я запутался, объясни пожалуйста.
Сразу говорю, я написал для понимания, в ней может по топорному написано, так что критика очень полезна. Мне нужно понимать.
Спасибо
Вложения
Тип файла: rar Fileto.rar (206.3 Кб, 3 просмотров)
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
23.04.2014, 20:50
Вот подправил, разбирайся. Там где немного исправил - поставил комментарии с !!!!!!!!!!!!!! в конце. А процедуры перемещения заменил полностью. Некогда особо комментировать. И так всё просто.
Кроме того, я уже писал, что если заменить в структуре Integer на Byte, а Real на Single - файл будет меньше. Проверил: файл уменьшился больше чем в 2 раза.
Ещё я имел в виду перемещение по массиву страничное. Т.ё. по клику сразу на количество строк, сколько помещается в StringGrid2 (ColCount). А то по одной строке у тебя будет очень долго просматривать. Или может и такой вариант плюс страничный. Если построчный нужен вообще.
Вложения
Тип файла: rar Fileto.rar (5.2 Кб, 8 просмотров)
1
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
23.04.2014, 21:15
Обрати внимание, что в событии закрытия формы я вставил освобождение памяти массива.
Ну и, ты сам понимаешь, что нет необходимости писать данные в StringGrid а потом в массив. Можно сразу писать в массив. Иначе у тебя опять при большом StringGrid-е будут проблемы. Да и в файл нет необходимости записывать. Накопил данные в массиве и потом выдавай их частями в StringGrid по клику кнопок.
При накоплении данных, если размерности массива не хватает - можно всегда дополнить:
Delphi
1
SetLength(MyArr,Length(MyArr)+10);
Те данные, которые в массиве уже были, при этом не теряются. Можно добавлять по одному элементу. Но, думаю это существенно увеличит время. Поэтому лучше добавлять сразу по 1000, например. А в конце уменьшить размерность массива до реального значения (по количеству данных).
0
 Аватар для PierL
4 / 4 / 0
Регистрация: 18.07.2013
Сообщений: 382
30.04.2014, 14:35  [ТС]
Цитата Сообщение от Одиночка Посмотреть сообщение
что если заменить в структуре Integer на Byte, а Real на Single - файл будет меньше
Я понял, но у меня возникла проблема преобразовать Byte и Single в String, чтобы там в мемо1 и StringGrid перекинуть данные.

Добавлено через 37 минут
Одиночка, посмотрел программу, все чётко работает, спасибо тебе и поклон!
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
30.04.2014, 16:19
Для преобразования Byte в String используется та же функция IntToStr. Для Single FloatToStr. Если ты это имел в виду.
0
Заблокирован
01.05.2014, 19:30
Вообще-то тут никаких массивов и стринггридов не надо. Всё делается гораздо проще и короче. И размер будет не таким уж большим, если эти данные надо сохранить...
0
01.05.2014, 19:36

Не по теме:

Ждёмс описания.

0
Заблокирован
01.05.2014, 19:46
Одиночка,
Смысла нет. Клиенту уже не надо.
А вообще - поток.
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
01.05.2014, 19:51
Думаю, и ТС ещё зайдёт. Он учится программировать, и новые знания ему не помешают. Да и для тех кто будет искать похожие решения - пригодится.
Имеешь в виду FileStream? Думаю не так всё просто. Ну, попробуй примерчик сделать. Плюс получишь.
0
Заблокирован
01.05.2014, 20:07
MemoryStream
Если взять 500000 строк да по 17 Это сколько будет?
Все данные одного формата. Ну, скажем 4 байта занимают.
Ну не больше 40 мегов будет поток. Браузер больше памяти жрёт.
Ну а с выводом тут уж надо посмотреть. Подходов море.
Только я не понял... Всего 17 строк и огроменная куча колонок?
Или 17 колонок и огроменая куча строк?
Как вообще такие длинные строки просматривать?
1
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
01.05.2014, 20:17
Мне кажется что использовать MemoryStream или динамический массив - разницы практически нет. Ну а проблема у него была в зависании при загрузке всех данных в StringGrid. Поэтому он хотел работать через файл.
0
Заблокирован
02.05.2014, 16:44
Одиночка,
Давай слёту, не задумываясь, скажи каким образом сохранить массив в файл. Без посредников.

Добавлено через 6 минут
Фигнёй он занимается... Из нескольких миллионов чисел, выдранных из текста, найти все комбинации, причем разной длины, для получения определённой суммы... А потом найти несколько необходимых через Excel. Это не одну сотню лет займёт, на компе, который виснет от нехватки памяти...
Я уже встречал одного человека, который этим занимается. Но это было давно. Может это он и есть?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.05.2014, 16:44

Считать массив из файла, записать результаты в другой файл
Программа рабочая, нужно переделать, так чтобы массив считывался из файла и сумма со средним арифметическим выводилась, и на экран, и в...

Распарсить строку и записать данные в массив
Как строку {оваться,у{йся,йтесь},у{юсь,ешься,ется,емся,етесь,ются,ясь},ова{лся,лась,лось,лись}} преобразовать в такой массив: ...

Распарсить текстовый файл и полученные данные записать в БД Access
Добрый день! Подскажите как организовать следующее: Есть текстовый файл. В нем содержаться персональные данные такие как ФИО, дата...

Записать результаты в файл
Здравствуйте. Подскажите пожалуйста как записать в файл то что у меня выводится на экран: две матрицы (в таком виде как они в консоли),...

Распарсить json и записать полученные данные в массив
Прочитал статью где такой json { "firstName": "Иван", "lastName": "Иванов", "address": { ...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru