Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
1 / 1 / 0
Регистрация: 27.06.2020
Сообщений: 15

Выборочное чтение из текстового файла (числа разного формата и символы)

28.06.2020, 02:11. Показов 1026. Ответов 11

Студворк — интернет-сервис помощи студентам
Доброго времени суток!

Хотел обратиться за помощью к коллективному разуму ибо самому в голову ничего не идёт.
Имеется текстовый файл - выхлоп программы анализа данных, выглядит так:

Code
1
2
3
4
5
6
7
8
9
10
11
12
1    1    1    AB    448907.656    448908.313    5.05347    0.00000    0.65630    N/A                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              
1    1    2    A    448908.313    448917.625    5.35640    0.48157    9.31250    N/A                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
1    1    1    A    448917.625    448920.625    4.39985    0.29791    3.00000    100.31297                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
1    1    2    A    448920.625    448923.969    5.78521    0.19467    3.34400    81.21828                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
1    1    3    A    448923.969    448927.281    7.00155    0.26773    3.31220    N/A                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
1    1    2    A    448927.281    448933.938    5.87670    0.26204    6.65630    150.23587                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   
1    1    3    AB    448933.938    448936.625    7.07897    0.10786    2.68750    100.31599                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
1    1    4    A    448936.625    448941.281    7.53165    0.13630    4.65620    N/A                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
1    1    3    A    448941.281    448945.281    7.05269    0.10215    4.00000    136.17114                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
1    1    4    A    448945.281    448956.250    7.61622    0.20834    10.96880    115.52413                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
1    1    0    A    449068.156    449076.813    -0.12689    0.31682    8.65630    N/A                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
1    1    1    A    449076.813    449093.469    4.07350    0.27229    16.65650    58.82353
Всего ~12 столбцов (разделённые табом) и 10-15К строк. Сразу оговорюсь - контролировать выдачу данных (формат чисел, кол-во столбцов) никак нельзя, т.е. работаю только с тем что есть.
В данный момент интересуют только столбцы 3 и 9, но могут со временем понадобиться ещё пара-тройка.
Сейчас (самое простое, что пришло в голову) я тупо читаю столбцы 1-9 в массив записей, а потом уж выдёргиваю оттуда нужные столбцы для анализа. Вроде всё работает.
Но хотелось бы это дело как-нить оптимизировать, например, сразу читать из файла только то что нужно, т.е. произвольные столбцы.
Файл текстовый и, как видно, столбцы начинаются на разных позициях в строке. Т.е. есть наверно вариант считать количество табов в строке и читать, например, после 2-го и 8-го (для столбцов 3 и 9), но похоже никакого выигрыша это не даст (+ надо вводить счётчик и т.д.).
Нет ли каких-нить других вариантов? Ничего придумать уже не могу, может лучше и не сделать? .
Если что - напишите словами, код я как-нить сам накидаю.

Спасибо!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.06.2020, 02:11
Ответы с готовыми решениями:

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

Выборочное чтение из файла
Бодрого дня, господа. Ни как не могу найти решение такой проблемки: Есть файл, допустим, info.txt: Первая строка Первого пункта ...

Выборочное чтение данных из файла
Простите за идиотский вопрос, но вся работа застопорилась, потому что никак не могу разобраться :( Есть программа, написанная,...

11
 Аватар для JuriiMW
5095 / 2661 / 2355
Регистрация: 10.12.2014
Сообщений: 10,060
29.06.2020, 08:52
Pascal
1
2
3
4
5
6
7
8
9
10
begin
  foreach var s in ReadLines('ерунда.тхт') do
    begin
      var a := s.ToWords(#32#9.ToArray);
      var n3 := StrToInt(a[2]);
      var n9 := StrToFloat(a[8]);
      var n10 := a[9]='N/A'?0.0:StrToFloat(a[9]);
      $'{n3}  {n9}  {n10}'.Println;
    end;
end.
1
 Аватар для mr-Crocodile
3053 / 1672 / 657
Регистрация: 19.03.2019
Сообщений: 5,380
29.06.2020, 10:52
Copper1, Паскаль то у тебя какой? Код от JuriiMW устраивает?
0
1 / 1 / 0
Регистрация: 27.06.2020
Сообщений: 15
29.06.2020, 23:17  [ТС]
JuriiMW, mr-Crocodile, спасибо за ответы!

Я пользуюсь FreePascal, а это, как я понимаю, ABC(.NET?).
Идею я вроде понимаю, только синтаксис незнакомый... Если я правильно понял, в ABC есть функция выделения слов из строки, я не уверен, что во Free тоже есть что-то готовое вроде этого.
Поправьте, если я ошибаюсь, но вот что предлагается:
- разбить строку на короткие строки (слова) на основе разделителей (Tab #9 и я не понял почему #32, который вроде двойка?) и писать их в короткий массив.
- потом читать из массива только слова с нужным номером в строке (каждые 3-и и т.д.) и переводить их в правильный числовой формат.
В принципе можно попробовать написать такую же процедуру самому. Не нужно будет открывать большой массив, я только не знаю, будет ли это работать сколько-нибудь быстрее.

Добавлено через 35 минут
UPD. Есть похожая штука и во FreePascal: ExtractWord. Так что можно попробовать использовать.
0
 Аватар для mr-Crocodile
3053 / 1672 / 657
Регистрация: 19.03.2019
Сообщений: 5,380
30.06.2020, 10:34
Цитата Сообщение от Copper1 Посмотреть сообщение
Я пользуюсь FreePascal
неплохо было бы сразу об этом сказать.

проверяй

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{$APPTYPE CONSOLE}
uses
  SysUtils, Classes;
 
var
  tsAll, tsOne:      TStringList;
  i: Cardinal;
 
begin
  tsAll := TStringList.Create;
  tsAll.LoadFromFile('tdata.txt');
 
  tsOne := TStringList.Create;
  tsOne.Delimiter:=#9;
 
  WriteLn('Selected Data from file');
  for i:=0 to tsAll.Count-1 do begin
    tsOne.DelimitedText:=tsAll.Strings[i];
    Writeln(Format( 'Row %d  Column 3 = "%s"  column 9 = "%s"',[i, tsOne.Strings[2], tsOne.Strings[8] ]));
  end;    
 
  tsOne.Free;
  tsAll.Free;
end.
если что - вот такой файл я использовал tdata.txt.zip
0
1 / 1 / 0
Регистрация: 27.06.2020
Сообщений: 15
30.06.2020, 19:18  [ТС]
mr-Crocodile, спасибо!
Я с классом TSringList незнаком (да и вообще с классами), так что буду читать.
Пока я сделал так:

Pascal
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
uses
sysutils, strutils;
 
const
WordDelims = [#9];
 
type
  DataRec=
    record
      level: byte;
      dwell: extended;
    end;
 
var 
f : text;
s : string;
i : cardinal;
MyDataRec: DataRec;
AR: array [0..2] of DataRec;
 
BEGIN
  assign(f,'input.txt');
  reset(f);
    for i:=0 to 2 do
      begin
        readln(f,s);
        MydataRec.level:=StrToInt(ExtractWord(3,s,WordDelims));
        MyDataRec.dwell:=StrToFloat(ExtractWord(9,s,WordDelims));
        AR[i]:=MyDataRec;
        writeln(AR[i].level,#9,AR[i].dwell);
      end;
  close(f);  
END.
Массив там вообще-то динамический, я сделал [0..2] чтобы только посмотреть. Количество строк в файле считает отдельная функция.
Вложения
Тип файла: txt input.txt (690 байт, 1 просмотров)
0
1 / 1 / 0
Регистрация: 27.06.2020
Сообщений: 15
30.06.2020, 19:26  [ТС]
А вариант с классом TStrings чем лучше?
0
 Аватар для mr-Crocodile
3053 / 1672 / 657
Регистрация: 19.03.2019
Сообщений: 5,380
02.07.2020, 09:54
Цитата Сообщение от Copper1 Посмотреть сообщение
А вариант с классом TStrings чем лучше?
на самом деле - ничем не лучше. Для меня этот вариант чуть проще (привычней). Этот код (при необходимости) заработает в Delphi.
Но в целом никаких выгод по сравнению с использованием ExtractWord я не вижу.
Более того, я посмотрел исходники ExtractWord и рискну предположить, что при некоторых условиях (когда нужен один/пара столбцов из строки, где столбцов много), эта функция будет намного эффективнее, чем парсить столбцы через TString -> DelimitedText

Так что - можно смело использовать ExtractWord

Добавлено через 7 минут
Цитата Сообщение от Copper1 Посмотреть сообщение
StrToFloat
между прочим, с этой функцией надо быть осторожнее. у меня этот код выдал ошибку
Code
1
2
An unhandled exception occurred at $0040CD96 :
EConvertError : "0.65630" is an invalid float
, потому что в файле десятичная точка, а у меня в системе разделитель - это запятая.
1
Модератор
10448 / 5739 / 3407
Регистрация: 17.08.2012
Сообщений: 17,460
04.07.2020, 01:12
Можно изменить разделитель:
Pascal
uses
  sysutils;
  //<...>
begin
  DefaultFormatSettings.DecimalSeparator := ',';
  //<...>
end.
И StrToFloat будет считать десятичным разделителем запятую.

Однако, стоит заметить, что, например, readln будет по-прежнему считать десятичным разделителем разделитель, указанный в системе, то есть, возможно, точку.
2
1 / 1 / 0
Регистрация: 27.06.2020
Сообщений: 15
10.07.2020, 00:36  [ТС]
Спасибо, всё (пока) понятно, написал, работает как хотел.
Заодно выкинул ненужную переменную MyDataRec и сделал адресацию через прямое обращение к элементам массива:
Code
1
2
AR[i].level := ...
AR[i].dwell := ...
1
1 / 1 / 0
Регистрация: 27.06.2020
Сообщений: 15
20.07.2020, 21:21  [ТС]
Если не возражаете, ещё один вопрос.
Я думаю переписать программу с использованием TStringList и тут есть (пока) две неясных детали.
1. После того как я заполню лист строками из текстового файла, мне нужно узнать количество строк (чтобы потом инициировать динамический массив, с которым, собственно, и будут проводиться манипуляции). TStringList.Count это дело выдаст, я только хотел бы узнать - это свойство (собственно, число) генерится автоматически при изменении числа строк в листе (и хранится где-то) или будет каждый раз пересчитывать число строк по каждому запросу TStringList.Count? Просто строк может быть много.
2. Правильно ли я понимаю, что работа с массивом будет всегда быстрее, чем с TStringList? Теоретически, можно завести второй лист, записать в него что нужно и работать с ним... В массиве будут сразу double, а в листе таки текст, который надо будет гонять во float и обратно.
Спасибо.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33402 / 21512 / 8236
Регистрация: 22.10.2011
Сообщений: 36,913
Записей в блоге: 12
25.07.2020, 16:33
Цитата Сообщение от Copper1 Посмотреть сообщение
это свойство (собственно, число) генерится автоматически при изменении числа строк в листе (и хранится где-то) или будет каждый раз пересчитывать число строк по каждому запросу TStringList.Count?
Нет, оно изменяется при изменении количества строк, а при обращении к свойству - просто выдает значение соответствующего поля, где этот счетчик хранится. Каждый раз пересчета не будет.
Цитата Сообщение от Copper1 Посмотреть сообщение
В массиве будут сразу double, а в листе таки текст, который надо будет гонять во float и обратно
FPC дает достаточно средств для работы со списками любого типа. Особенно версия 3.2.0...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.07.2020, 16:33
Помогаю со студенческими работами здесь

Печать многостраничного файла разного формата
Дано: принтер 2 кассеты (одна А3, вторая А4), документ корела допустим из пяти страниц (1-2 страница А4 книжная, 3-я А3 альбомная,...

Чтение из файла построчно переменных разного типа
Есть файл исходных данных input.txt. там содержатся данные о сети (точки начала и конца ветвей, марки провода и т.п.) есть файл...

Прочитать из текстового файла символы, прибавить к их кодам 5, вывести новые символы на экран
Прочитать из текстового файла символы, прибавить к их кодам 5, вывести новые символы на экран; #include &lt;stdio.h&gt; int main() ...

Прочитать из текстового файла символы, прибавить к их кодам 3, вывести новые символы в текстовый файл
Прочитать из текстового файла символы, прибавить к их кодам 3, вывести новые символы в текстовый файл; #include &lt;cstdio&gt; ...

Как заменить чтение строки из консоли на чтение текстового файла?
основное задание: найти частоту суффикса (например, &quot;ing&quot;) в текстовом документе. в прикреплённом коде текст вводится прямо в консоль,...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru