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

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

10.04.2014, 15:37. Показов 5626. Ответов 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
02.05.2014, 16:55
Студворк — интернет-сервис помощи студентам

Не по теме:

Leoparrd
Знаешь, у меня нет времени спорить. Тем более что с MemoryStream не работал и только примерно представляю как она работает.
А у тебя если есть опыт и желание, прочти тему внимательно и сделай нормальный код, как бы ты это сделал. Вполне может быть, что у тебя получится более оптимальный и лучший код.
У меня небыло времени это сделать (да и сейчас нет). Поэтому я просто помогал человеку привести его исходные наработки и мысли к рабочему варианту. Т.е. задача-минимум была решена.

0
 Аватар для PierL
4 / 4 / 0
Регистрация: 18.07.2013
Сообщений: 382
05.05.2014, 08:31  [ТС]
Цитата Сообщение от Одиночка Посмотреть сообщение
Для преобразования Byte в String используется та же функция IntToStr. Для Single FloatToStr. Если ты это имел в виду.
Представляешь, до этого не преобразовывалось почему-то, сейчас работает.

Дело было не в бабине...!
0
 Аватар для PierL
4 / 4 / 0
Регистрация: 18.07.2013
Сообщений: 382
06.05.2014, 14:58  [ТС]
Одиночка, подскажи пожалуйста. Этот массив
Delphi
1
MyArr[i].Per[n].Res[j]
как проще сортировать? (Т.е. у меня этих массивчиков допустим десять и мне надо по каждому элементу Per и Res сортировать и выдавать в stringgrid) Каким методом лучше или там вообще все проще простого?

Мне тогда Puporev помогал, но там было на StringGride все завязано.
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
06.05.2014, 16:02
Если я правильно понимаю твою задачу, у тебя все твои строки находятся в массиве MyArr. В каждом элементе массива находится типизированная запись, содержащая массивчики ZnPer и Res с исходными и результирующими значениями. Так, по крайней мере, было в последнем варианте. Причём тут несколько массивов?
Тебе нужно отсортировать массив MyArr по какому-то значению из массива ZnPer или Res.
Вот и делаешь процедуру:
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
Procedure MySort(Index:Integer); //Index - это по какому индексу сортировать (меньше 12 - в массиве ZnPer)
Var
  i,j,m,n : Integer;
  x : Single;
  t : TZap;
Begin
   //Чтобы не сравнивать каждый раз в цикле - лучше разные коды для разных массивов
   If Index>11 Then
   For i:=Low(MyArr) To High(MyArr)-1 Do
   Begin
     x:=MyArr[i].Res[Index];
     n:=i;
     For j:=i+1 To High(MyArr) Do
     If x>MyArr[j].Res[Index] Then
     Begin
       x:=MyArr[j].Res[Index];
       n:=j;
     End;
     If n<>i Then
     Begin //Поменяли местами
       t:=MyArr[i];
       MyArr[i]:=MyArr[n];
       MyArr[n]:=t;
     End;
   End Else
   For i:=Low(MyArr) To High(MyArr)-1 Do
   Begin
     m:=MyArr[i].ZnPer[Index];
     n:=i;
     For j:=i+1 To High(MyArr) Do
     If m>MyArr[j].ZnPer[Index] Then
     Begin
       m:=MyArr[j].ZnPer[Index];
       n:=j;
     End;
     If n<>i Then
     Begin //Поменяли местами
       t:=MyArr[i];
       MyArr[i]:=MyArr[n];
       MyArr[n]:=t;
     End;
   End;
End;
Не помню, правда, как метод называется.

Добавлено через 8 минут
Забыл написать (вдруг сам не догадаешься).
Если тебе нужно отсортировать, например по 5-му элементу в массиве ZnPer - обращение:
Delphi
1
MySort(5);
По 3-му элементу в массиве Res (14):
Delphi
1
MySort(14);
А выдаёшь в StringGrid как и раньше. Только уже значения будут браться из отсортированного массива.
1
 Аватар для PierL
4 / 4 / 0
Регистрация: 18.07.2013
Сообщений: 382
12.05.2014, 14:42  [ТС]
Цитата Сообщение от Одиночка Посмотреть сообщение
А выдаёшь в StringGrid как и раньше.
Сортировка отлично работает!
Кликните здесь для просмотра всего текста
Спасибо тебе, Одиночка, ты крутой спец!
0
 Аватар для PierL
4 / 4 / 0
Регистрация: 18.07.2013
Сообщений: 382
22.05.2014, 14:31  [ТС]
Цитата Сообщение от Одиночка Посмотреть сообщение
массив MyArr со значениями ZnPer и Res.
Я хочу добавить сохранять в этот массив еще 10 стринговских переменных по 10 символов каждый, т.е. это названия будут сохраняться.
Добавляю
Delphi
1
u1,u2...u10:String[10];
файл.dat сразу значительно больше становиться.
Хотел бы спросить, как мне оптимизировать массив MyArr, чтобы названия (u1, u2...,u10) просто добавились в конец файла и все.
А у меня получается, что в каждый массив MyArr[n] добовляется 10 переменных, по 10 байт каждая, как-то не правильно.
Чтобы понятнее было:
Есть массив
MyArr[0].ZnPer[1]
MyArr[0].ZnPer[2]
MyArr[0].ZnPer[3]
MyArr[0].ZnPer[4]
MyArr[0].ZnPer[5]
MyArr[0].ZnPer[6]
MyArr[0].ZnPer[7]
MyArr[0].ZnPer[8]
MyArr[0].ZnPer[9]
MyArr[0].ZnPer[10]
и т.д. до MyArr[n].ZnPer[1]
...
...
Мне надо этим десяти значениям ZnPer[1] -ZnPer[10] -сохранить в файл их названия.
получается таблица (Пример):
Название 1512...3
Название 234...12
Название 3115...4
Название 4411...25
Название 5218...17
Название 6710...31
Название 7127...2
Название 843...5
Название 967...17
Название 10223...16
Т.е. надо сохранить десять названий один раз и навсегда в этот файл.dat
У меня файл в 3 раза больше становится, может как-то по умному можно.
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
22.05.2014, 21:09
Можешь свою запись описать немного по другому:
Delphi
1
2
3
4
5
6
    TZap = record
    ZnPer : array[1..11] of byte; //Для значений до 100 хватит типа Byte (1х11 b)
    Case Byte Of
    0 : (Res : array[12..18] of single);
    1 : (Nam : String[10]);
  end;
Т.е. ты сможешь в неё писать либо массив Res, либо своё название.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
//Либо так:
MyArr[i].Res[i]...
//Либо так:
MyArr[i].Nam...
//Или...
Var
Zap : TZap;
Zap.Nam:='Моё название';
Write(f,Zap); //Записали запись в файл
...
Read(f,Zap); //Считали запись из файла
s:=Zap.Nam;
Ну а при записи названия в какую-нибудь ячейку массива ZnPer в записи можешь писать номер, идентифицирующий название.
Далее...
Работа с числами, практически не меняется. Практически, потому что тебе нужно будет учитывать наличие этих записей с названиями в файле.
Далее просто в начале или в конце файла записываешь свои записи с названиями. Естественно, когда будешь их формировать - нужно будет писать названия вместо массива Res. В этом описании я предположил, что в одной записи будет одно твоё название. Т.е. чтобы записать твои 10 названий придётся писать 10 записей. Для позиционирования указателя файла на первую из этих записей - используй Seek. Например, если ты их запишешь в конец файла то чтобы перейти на первую из них пишем:
Delphi
1
Seek(f,FileSize(f)-10);
На диске они займут примерно 400 байт. Думаю это ерунда. Размер твоей исходной записи 39 байт, поэтому, в принципе в неё можно впихнуть 3 названия. Но тогда тебе будет сложнее их обрабатывать. Думаю не стоит.
Естественно, что при работе с файлом тебе нужно учитывать наличие этих 10-ти нестандартных записей. Соответственно при работе с файлом нужно будет писать:
Delphi
1
2
3
4
//вместо
  while not Eof(F) do //Проверка на конец файла
//нужно будет писать
  while (FileSize(f)<(FileSize(f)-10)) do //Проверка на конец данных
Ну и имей в виду, что я не знаю весь твой код, поэтому сам должен посмотреть точки, где может влиять конец файла и там тоже подкорректируй код.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.05.2014, 21:09

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
47
Ответ Создать тему
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru