Как Открыть Файл Расширением Dat В Delphi?

  • Автор темы Автор темы SantilaS
  • Дата начала Дата начала
S

SantilaS

Здравствуйте. Столкнулся с проблеммой открытия файла созданного при помощи измерительной лаборатории МПИ СЦБ с расширением adc (осцилограмма, график зависимости напряжения от времени). Разработчики прибора отписали, что данный тип файла является проетарным (авторские права) и с ним нельзя работать. Посоветовали использовать конвертор внутри пакета ПО прибора, который делаем из него файл с расширением dat. Задача состоит в том, чтобы открыть этот файл в Delphi для просмотра, т.к. ПО написано под DOS. Прошу откликнуться знающих людей или дать совет по работе над данным файлом. Отвечать можно на avfelichev@mail.ru. Примеры в приложенном файле.
 

Вложения

Даже не знаю. Я бы наверно обрезал мусор в начале и с помощью цикла, работал бы с данными.
Строки вида:
Код:
3.74803e-005 0.156288
Если Вы понимаете что это, то труда не составит написать обработчик. Мне лично не ясно что эти цифры значат.
 
Посоветовали использовать конвертор внутри пакета ПО прибора, который делаем из него файл с расширением dat. Задача состоит в том, чтобы открыть этот файл в Delphi для просмотра, т.к. ПО написано под DOS. Прошу откликнуться знающих людей или дать совет по работе над данным файлом. Отвечать можно на avfelichev@mail.ru. Примеры в приложенном файле.
Teechart вполне рулит...
Конвертируем и грузим...
В "первом приближении" так...
Код:
procedure TForm1.LoadDataClick(Sender: TObject);
var
b: Byte;
a: PAnsiChar;
x,y: Double;
data: TStringList;
i: Integer;
m: TMemoryStream;
begin
OpenDialog1.InitialDir := ExtractFileDir(Application.ExeName);
if not OpenDialog1.Execute then
Exit;

// 1. Грузим файл в память
m := TMemoryStream.Create;
m.LoadFromFile(OpenDialog1.FileName);
Pointer(a) := m.Memory;
// 2. Удаляем #0 отделяющий заголовок от данных
i := 1;
while (i < m.Size) do
begin
if a^ = #0 then
a^ := ' ';
Inc(a);
Inc(i);
end;

// 3. добавляем в конец завершающий #0 (чтобы получилась корректная строка)
m.Position := m.Size;
b := 0;
m.WriteBuffer(b,1);

// 4. Конвертируем строку (в памяти) из дос кодировки (OEM) в виндовс кодировку (Ansi)
Pointer(a) := m.Memory;
OemToAnsi(a,a);

// 5. Загружаем данные в стринглист
m.Position := 0;
data := TStringList.Create;
data.LoadFromStream(m);
m.Free;


if data.Count < 2 then
Exit;

Caption := Application.Title;

// 6. "Вынимаем" заголовок
//6.1. Первые две строчки в стринглисте однозначно заголовок
// Помещаем их в Title Chart-а и удаляем из стринглиста (чтобы дальше не "путались под ногами")
Chart1.Title.Text.Clear;
Chart1.Title.Text.Add(data[0]);
data.Delete(0);
Chart1.Title.Text.Add(data[0]);
data.Delete(0);


//6.2. Следующие две строчки - я не знаю что это такое
// поэтому тоже пихаю в в Title Chart-а
// Если Вы знаете что это, можете обработать их как нибудь по другому
Chart1.Title.Text.Add(data[0]);
data.Delete(0);
Chart1.Title.Text.Add(data[0]);
data.Delete(0);

Series1.Clear;

if (data.Count < 1) then
begin
ShowMessage('Нет данных для вывода');
Exit;
end;

// 7. Приводим строчки в стринглисте к виду <name>=<value>
// по умолчанию у стринглиста name|value сепаратором является символ "="
// поэтому заменяем пробел на "=" во всех строчках
for i := 0 to data.Count-1 do
data[i] := StringReplace(data[i],' ','=',[rfReplaceAll, rfIgnoreCase]);

///////////////////////////////////////////////////////////////////
// Теперь наши данные готовы к использованию. Заносим их в Chart //
///////////////////////////////////////////////////////////////////



// Поскольку в региональных настройках на компьютере пользователя
// разделителем десятичных чисел может оказаться знак ","
// на всякий случай заменяем на "." (на настройки системы это не повлияет)
// иначе StrToFloat будет выдавать ошибку
DecimalSeparator := '.';

// Заносим данные в серию Chart-а
for i := 0 to data.Count-1 do
begin
x := StrToFloat(data.Names[i]);
y := StrToFloat(data.ValueFromIndex[i]);
Series1.AddXY(x,y,data.Names[i]);
end;

// Запоминаем начальную и конечную точку данных
// Они нам потребуются для масштабирования и скроллинга
if (data.Count > 1) then
begin
StartPos := StrToFloat(data.Names[0]);
StopPos := StrToFloat(data.Names[data.Count-1]);
end
else
begin
StartPos := StrToFloat(data.Names[0]);
StopPos := StrToFloat(data.Names[0]);
end;

data.Free;
ZoomClear.Click;
Caption := Application.Title + ' - '+ ExtractFileName(OpenDialog1.FileName);
end;

Вот, если нужно, полный код проекта
Посмотреть вложение Oscilograph.rar
 
Даже не знаю. Я бы наверно обрезал мусор в начале и с помощью цикла, работал бы с данными.
Строки вида:
Код:
3.74803e-005 0.156288
Если Вы понимаете что это, то труда не составит написать обработчик. Мне лично не ясно что эти цифры значат.

Эти цифры - координата по оси "У" и координата по оси "Х". Зависимость напряжения от времени. В программировании не силен, а задача состоит в том, чтобы написать программу, которая при выборе файла .dat строила бы граффик по координатам и представляла пользователю картинку. Благодарю за ответ.

Добавлено: Большое спасибо за помощь.
 
привет!
нужна ещё она? ... программка?
и на сколько должна быть "крутая"
то есть, энти самые разработчики наразрабатывали...
засунули символ окончания файла после заголовка.
то есть - просто взять и открыть файл не удаётся - нужно или читать его "умным способом", что лениво писать
или перед использованием открыть в текстовом редакторе и удалить один "непечатный символ"
определить какой - просто. открой .dat в моей програмке, символ, на котором оборвалось считывание - тот самый, который
..разработчикам не стоило бы использовать ;)

график... очень длинный график - 80 тысяч точек на экран не влазит...
ну, запихнул, как получилось
нужно кликнуть "обновить" на закладке "График"
можно выбрать как рисовать - точками или линией и размер по "У"
если кликать мышкой на нижнем графике - под ним будут значения "Х" и "У"
а если кликнуть двойным, то увидешь кусок графика в увеличенном виде в окошке с верху
(от места, где кликнул и на сколько хватит верхнего окна)

прикрепленно : програмка, *.dat без энтого символа ))
Посмотреть вложение grafic.rar

***график простенький - достаточно чтобы определиться, что именно нужно
***если что - пиши на мыло.
***я не часто сюда заглядываю..
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!

Курс AD