Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.54/26: Рейтинг темы: голосов - 26, средняя оценка - 4.54
0 / 0 / 0
Регистрация: 16.09.2017
Сообщений: 164

Чтение из папки и дальнейшее осреднение значений

16.09.2019, 15:56. Показов 6519. Ответов 87

Студворк — интернет-сервис помощи студентам
Здравствуйте. Нужна помощь.
Как лучше решить проблему?
Есть данные( прилагаются в файле)
Год, месяц, день, координаты(две) и далее значения
RESULT
1996.00 11.00 20.00 58.44 -54.49 3.79 4.23 4.23 4.23 4.24 4.24 4.24 4.30 4.41 4.42 4.39 4.39 4.36 4.29 4.21 4.11 4.04 3.95 3.89 3.84 3.79 3.45 3.61 3.54 3.53 3.50 3.49 3.51 3.52 3.39 3.28 3.22 3.19 3.19 3.24 3.16 3.11 3.07 3.05 3.01 2.96 2.93 2.94 2.94 2.94 2.94 2.94 2.94 2.94 2.94 2.94 2.92 2.91 2.90
RESULT
1997.00 2.00 12.00 58.87 -54.52 3.17 3.59 3.59 3.59 3.59 3.59 3.59 3.59 3.59 3.59 3.59 3.58 3.59 3.59 3.59 3.59 3.59 3.59 3.59 3.55 3.46 3.29 3.22 3.20 3.19 3.20 3.22 3.22 3.23 3.23 3.27 3.38 3.46 3.45 3.45 3.40 3.22 3.19 3.21 3.19 3.14 3.10 3.06 3.03 3.00 2.99 2.98 2.99 2.99 2.98 2.97 2.95 2.94 2.93
RESULT
1998.00 11.00 6.00 56.00 -45.48 6.70 6.92 6.92 6.92 6.93 6.93 6.93 6.87 4.71 3.59 3.46 3.40 3.34 3.32 3.28 3.27 3.28 3.24 3.24 3.23 3.26 3.37 3.36 3.36 3.37 3.35 3.33 3.32 3.30 3.29 3.26 3.23 3.24 3.25 3.27 3.28 3.26 3.24 3.23 3.22 3.21 3.20 3.19 3.17 3.13 3.11 3.09 3.07 3.05 3.04 3.03
RESULT
1998.00 11.00 13.00 55.99 -45.36 6.21 6.25 6.25 6.25 6.26 6.26 6.26 6.25 5.08 3.63 3.45 3.39 3.35 3.32 3.30 3.28 3.28 3.25 3.24 3.31 3.31 3.23 3.20 3.23 3.27 3.39 3.47 3.40 3.38 3.35 3.36 3.36 3.38 3.37 3.32 3.31 3.27 3.25 3.24 3.21 3.21 3.20 3.18 3.16 3.13 3.10 3.09 3.06 3.04 3.03 3.02
RESULT
1998.00 11.00 20.00 55.92 -45.08 5.94 6.11 6.12 6.11 6.11 6.08 6.03 6.02 5.88 3.89 3.48 3.48 3.37 3.39 3.38 3.38 3.34 3.30 3.27 3.27 3.29 3.34 3.39 3.41 3.40 3.38 3.36 3.34 3.33 3.32 3.29 3.28 3.27 3.28 3.29 3.28 3.27 3.25 3.23 3.22 3.21 3.19 3.17 3.15 3.13 3.11 3.07 3.06 3.06 3.04 3.02

, нужно их прочитать
И далее рассчитать среднемесячное значение в каждой координате...координаты через градус из тех, что имеются.
1996 год 1мес координаты 1 1 значения 3.79 4.23 4.23 4.23 4.24 4.24 4.24 4.30 4.41 4.42 4.39 4.39 и т.д
1996 год 2мес координаты 1 1 значения 3.79 4.23 4.23 4.23 4.24 4.24 4.24 4.30 4.41 4.42 4.39 4.39 и т.д
1996 год 3мес координаты 1 1 значения 3.79 4.23 4.23 4.23 4.24 4.24 4.24 4.30 4.41 4.42 4.39 4.39 и т.д
........................................ ........................................ ........................................ ........................................ .................
1996 год 12мес координаты 1 1 значения 3.79 4.23 4.23 4.23 4.24 4.24 4.24 4.30 4.41 4.42 4.39 4.39 и т.д
........................................ ........................................ ........................................ ........................................ .................
1996 год 1мес координаты 2 2 значения 3.79 4.23 4.23 4.23 4.24 4.24 4.24 4.30 4.41 4.42 4.39 4.39 и т.д
........................................ ........................................ ........................................ ........................................ .................
1996 год 12мес координаты 2 2 значения 3.79 4.23 4.23 4.23 4.24 4.24 4.24 4.30 4.41 4.42 4.39 4.39 и т.д
........................................ ........................................ ........................................ ........................................ .................
1996 год 1мес координаты 88 179 значения 3.79 4.23 4.23 4.23 4.24 4.24 4.24 4.30 4.41 4.42 4.39 4.39 и т.д
........................................ ........................................ ........................................ ........................................ .................
1997 год 1мес координаты 1 1 значения 3.79 4.23 4.23 4.23 4.24 4.24 4.24 4.30 4.41 4.42 4.39 4.39 и т.д
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.09.2019, 15:56
Ответы с готовыми решениями:

Чтение данных и осреднение по шаблону
Здравствуйте, нужна помощь , тех , кто не боится научить. Подскажите , с чего начать работу? Задача и прикладная и познавательная. Я...

Дальнейшее чтение после Р.Лафоре искусство ООП программирования С++
Всем привет. Прочел книгу Р.Лафоре искусство ООП программирования С++. И вот стою курю и думаю. А что собственно, дальше. Я вроде как...

Чтение и индексирование fb2-файла и дальнейшее разбиение на страницы
Продолжение темы https://www.cyberforum.ru/csharp-beginners/thread1155294.html Посоветовали индексировать читаемый файл. После...

87
0 / 0 / 0
Регистрация: 16.09.2017
Сообщений: 164
30.09.2019, 17:16  [ТС]
Студворк — интернет-сервис помощи студентам
UR1004SWL, из таких данных получено.
Вложения
Тип файла: rar 1 comb.rar (27.4 Кб, 5 просмотров)
0
561 / 230 / 88
Регистрация: 11.07.2015
Сообщений: 817
30.09.2019, 18:31
Юля С
Для чтения и работы с такими файлами используют netcdf.dll, для Delphi есть модуль.
Вложения
Тип файла: zip DelphiNetCDF-master.zip (5.6 Кб, 7 просмотров)
1
0 / 0 / 0
Регистрация: 16.09.2017
Сообщений: 164
02.10.2019, 11:58  [ТС]
Пытливый, Большего размера не прошел.
Вложения
Тип файла: rar data.rar (17.97 Мб, 2 просмотров)
0
 Аватар для Пытливый
3764 / 2272 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
02.10.2019, 13:12
Не в размере дело, а в правильности исходных данных. Это очень грязный файл, содержит огромное количество ошибок данных.
0
 Аватар для Пытливый
3764 / 2272 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
02.10.2019, 13:21
Кашмарный файл, данные пропущены, формат чисел разный и т.д. Я сделал обработку ошибок с выводом строки ее вызвавшей - ужас.
Вложения
Тип файла: rar Demo.rar (1.17 Мб, 2 просмотров)
0
 Аватар для Пытливый
3764 / 2272 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
03.10.2019, 12:51
А вот файлы, которые вы к сообщению прикрепили, я так понял послужили первоисточником данных? Вы их через ncdump из пакета netCDF каждый обрабатывали?
0
0 / 0 / 0
Регистрация: 16.09.2017
Сообщений: 164
03.10.2019, 22:00  [ТС]
Пытливый, МАтлаб.
0
6 / 6 / 3
Регистрация: 31.08.2017
Сообщений: 108
03.10.2019, 22:10
Юля С, Данные у нас аналогичные. Даже эти данные. В дельфи вам пошлю набросок. А так я в Матлаб открывал.
0
 Аватар для Пытливый
3764 / 2272 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
03.10.2019, 23:57
Я собственно к чему спрашиваю. Я прогнав файлы через ncdump получил точно такой-же результат, который вы опубликовали ранее по ссылке
И вот этот результат прекрасно обрабатывается, не наблюдается никаких странных дат и пустых строк. Единственное неудобство, что для импорта через ncdump надо еще несколько DLL файлов рядом держать. Такой импорт легко встроить в программу и не надо делать промежуточных файлов.
0
0 / 0 / 0
Регистрация: 16.09.2017
Сообщений: 164
04.10.2019, 13:34  [ТС]
Пытливый, нет ncdump не пользовалась.
0
 Аватар для Пытливый
3764 / 2272 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
09.10.2019, 23:54
Продолжаем разговор. Обработка nc-файлов Матлабом явно дает плохой результат, а потому я предлагаю делать это иначе. Я проверил этот способ на более чем 20 тыс. nc-файлах, тест ошибок не дал.
Вот собственно весь код:
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
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
type
  TCDFFile = class
   private
    AData: TStringList;
    function GetProperty(const Index: Integer): Variant;
    function GetParamValue(ParamName: String; ParamType: TFieldType = ftString): Variant;
   public
    ID: String;
    DllPath: String;
    constructor Create;
    function Load(FileName: String): Boolean;
    property Date: Variant index 0 read GetProperty;
    property Time: Variant index 1 read GetProperty;
    property Latitude: Variant index 2 read GetProperty;
    property Longitude: Variant index 3 read GetProperty;
    property Pressure: Variant index 4 read GetProperty;
    property Temperature: Variant index 5 read GetProperty;
    property Salinity: Variant index 6 read GetProperty;
  end;
 
function GetDosOutput(CommandLine: string; Work: string = 'C:\'): string;
var
  SA: TSecurityAttributes;
  SI: TStartupInfo;
  PI: TProcessInformation;
  StdOutPipeRead, StdOutPipeWrite: THandle;
  WasOK: Boolean;
  Buffer: array[0..255] of AnsiChar;
  BytesRead: Cardinal;
  WorkDir: string;
  Handle: Boolean;
begin
  Result := '';
  with SA do begin
    nLength := SizeOf(SA);
    bInheritHandle := True;
    lpSecurityDescriptor := nil;
  end;
  CreatePipe(StdOutPipeRead, StdOutPipeWrite, @SA, 0);
  try
    with SI do
    begin
      FillChar(SI, SizeOf(SI), 0);
      cb := SizeOf(SI);
      dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
      wShowWindow := SW_HIDE;
      hStdInput := GetStdHandle(STD_INPUT_HANDLE); // don't redirect stdin
      hStdOutput := StdOutPipeWrite;
      hStdError := StdOutPipeWrite;
    end;
    WorkDir := Work;
    Handle := CreateProcess(nil, PChar('cmd.exe /C ' + CommandLine),
                            nil, nil, True, 0, nil,
                            PChar(WorkDir), SI, PI);
    CloseHandle(StdOutPipeWrite);
    if Handle then
      try
        repeat
          WasOK := ReadFile(StdOutPipeRead, Buffer, 255, BytesRead, nil);
          if BytesRead > 0 then
          begin
            Buffer[BytesRead] := #0;
            Result := Result + Buffer;
          end;
        until not WasOK or (BytesRead = 0);
        WaitForSingleObject(PI.hProcess, INFINITE);
      finally
        CloseHandle(PI.hThread);
        CloseHandle(PI.hProcess);
      end;
  finally
    CloseHandle(StdOutPipeRead);
  end;
end;
 
{ TCDFFile }
 
constructor TCDFFile.Create;
begin
 AData := TStringList.Create;
end;
 
function TCDFFile.Load(FileName: String): Boolean;
begin
 try
  Result := True;
  AData.Text := GetDosOutput('ncdump.exe ' + FileName, DllPath);
  if Copy(AData.Text, 1, 6) <> 'netcdf' then raise Exception.Create('Неизвестный формат файла');
  ID := Copy(AData.Text, Pos('\', AData.Text)+1, Pos('{', AData.Text)-Pos('\', AData.Text)-2);
  AData.Text := Copy(AData.Text, Pos('data:', AData.Text) + 5, Length(AData.Text));
 except
  Result := False;
 end;
end;
 
function TCDFFile.GetParamValue(ParamName: String; ParamType: TFieldType): Variant;
var
  BPos,EPos,i: Integer;
  SL: TStringList;
begin
 BPos := Pos(ParamName, AData.Text, 1);
 if BPos = 0 then Exit;
 BPos := BPos + Length(ParamName) + Length(' =') + 1;
 EPos := Pos(';', AData.Text, BPos) - 1;
 Result := Copy(AData.Text, BPos, EPos - BPos);
 case ParamType of
   ftDate: begin
           Result := Copy('00000000',1,8-Length(Result))+Result;
           Result := Copy(Result,7,2)+'.'+Copy(Result,5,2)+'.'+Copy(Result,1,4);
           Result := StrToDate(Result);
           end;
   ftTime: begin
           Result := Copy('000000',1,6-Length(Result))+Result;
           Result := Copy(Result,1,2)+':'+Copy(Result,3,2)+':'+Copy(Result,5,2);
           Result := StrToTime(Result);
           end;
   ftFloat: begin
            Result := StringReplace(Result,'.',',',[]);
            Result := StrToFloat(Result);
            end;
   ftArray: begin
            while Pos('  ', Result) > 0
            do begin
               Result := StringReplace(Result,#32#32,#32,[rfReplaceAll]);
               Result := StringReplace(Result,#13#10,'',[rfReplaceAll]);
               end;
            SL := TStringList.Create;
            SL.StrictDelimiter := True;
            SL.CommaText := Result;
            Result := VarArrayCreate([0,SL.Count-1], varSingle);
            for i := 0 to SL.Count-1
            do Result[i] := StringReplace(SL[i],'.',',',[]);
            SL.Free;
            end;
 end;
end;
 
function TCDFFile.GetProperty(const Index: Integer): Variant;
var FS: TFormatSettings;
begin
 FS := TFormatSettings.Create;
 Result := null;
 case Index
 of 0: Result := GetParamValue('woce_date', ftDate);
    1: Result := GetParamValue('woce_time', ftTime);
    2: Result := GetParamValue('latitude', ftFloat);
    3: Result := GetParamValue('longitude', ftFloat);
    4: Result := GetParamValue('pressure', ftArray);
    5: Result := GetParamValue('temperature', ftArray);
    6: Result := GetParamValue('salinity', ftArray);
 end;
end;
А вот так это все работает:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var
  CDFFile: TCDFFile;
...
CDFFile := TCDFFile.Create;
CDFFile.DllPath := DllPath;
ResultCount := VarArrayHighBound(CDFFile.Pressure, 1);
if CDFFile.Pressure <> null
then for n := 0 to ResultCount - 1
       do // получаем значения давления из CDFFile.Pressure[n];
if CDFFile.Temperature <> null
then for n := 0 to ResultCount - 1
       do // получаем значения температуры из CDFFile.Temperature[n];
if CDFFile.Salinity <> null
then for n := 0 to ResultCount - 1
       do // получаем значения уровня шума из CDFFile.Salinity[n];
Для импорта будут необходимы файлы:
hdf5.dll
hdf5_hl.dll
netcdf.dll
zlib1.dll
ncdump.exe
которые идут в комплекте с netCDF 4.7.1. Эти файлы помещаются в один каталог путь к которому передается в качестве параметра в CDFFile.DllPath
0
 Аватар для Пытливый
3764 / 2272 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
11.10.2019, 02:12
Как-то затянула меня эта задачка. В итоге получилась вот такая, довольно симпатичная штука.
Миниатюры
Чтение из папки и дальнейшее осреднение значений  
0
0 / 0 / 0
Регистрация: 16.09.2017
Сообщений: 164
12.10.2019, 18:34  [ТС]
Пытливый, Это Демо доработали?
0
 Аватар для Пытливый
3764 / 2272 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
12.10.2019, 20:23
Это скорее уже не демо, а полноценное приложение. Пока руки не дошли до Экспорта и Сравнения, занялся доработкой библиотеки чтения CDF-файлов, да вот застрял на изучении ссылки с данными, что мне кинул Sayres. У него все намного сложнее, там похоже все заинтересованные организации тучу данных из этих файлов получают, но данные совершенно свежие. Плохо, что там нет данных по нашему северу и конечно очень мешает отсутствие знаний в данной области, непонятно что важно, а что не очень.

Выкладываю рабочий вариант. Загружать данные теперь нужно только один раз. Приложение ведет собственную базу. Исходными данными для импорта являются nc-файлы опубликованные на https://www.nodc.noaa.gov/woce... uminfo.htm
Вложения
Тип файла: rar Beakon.rar (6.44 Мб, 4 просмотров)
0
 Аватар для Пытливый
3764 / 2272 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
13.10.2019, 22:59
Подправил небольшие баги и доделал экспорт. Пробуйте.
Вложения
Тип файла: rar Beakon.rar (6.48 Мб, 6 просмотров)
0
 Аватар для Пытливый
3764 / 2272 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
20.10.2019, 13:42
Очередное обновление. Небольшие косметические улучшения.
Вложения
Тип файла: rar Beakon.rar (5.51 Мб, 3 просмотров)
0
 Аватар для Пытливый
3764 / 2272 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
21.10.2019, 23:13
Поспешил с публикацией обновления вчера, накосячил слегка
Подправленная версия. В архиве только исполняемый файл. Библиотеки и база не менялись.
Вложения
Тип файла: rar Beakon.rar (5.51 Мб, 5 просмотров)
0
6 / 6 / 3
Регистрация: 31.08.2017
Сообщений: 108
06.11.2019, 22:56
Пытливый, выложу тут cdo к чтению
Вложения
Тип файла: rar cdo.rar (3.31 Мб, 1 просмотров)
0
6 / 6 / 3
Регистрация: 31.08.2017
Сообщений: 108
14.11.2019, 15:59
тельно перевести на стандарнтые горизонты подобно таким
0
5
10
20
30
50
75
100
125
150
200
250
300
400
500
600
700
800
900
1000
1100
1200
1300
1400
1500
1750
2000
0
Модератор
 Аватар для D1973
9951 / 6486 / 2461
Регистрация: 21.01.2014
Сообщений: 27,481
Записей в блоге: 3
14.11.2019, 16:56

Не по теме:

только надо обязательно тельно перевести!!! Нетельно - не канает...
Это уже из животноводства прямо что-то...



Добавлено через 2 минуты

Не по теме:

Это была шутка над опечаткой, если что... Никому не в обиду...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.11.2019, 16:56

Чтение файла, чтение названия папки где находится файл, запись данных на PHP
Допустим у нас есть структура с папками типа Large -&gt; Vehicles -&gt; Firetruck_0 В этой папке лежит файл формата .dat Что нужно сделать? ...

Чтение списка из файла и дальнейшее использование информации из файла
основная using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; ...

Осреднение
Здравствуйте Есть буфер рассчитанных значений (самплов) с адаптивным шагом d, клиент задает точку (x. y) в координатах буфера и...

Чтение файлов из папки
Помогите разобраться, кому не сложно. Только начал изучать php. В универе задание создать сайт по определенному формату. По заданию нужно...

Чтение файлов из папки
Здравствуйте, подскажите пожалуйста.... Пытаюсь считать файлы из папки и записать их в файлы. В случае с одним файлом считывание и...


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru