Чтение .dat файла в python - PullRequest
6 голосов
/ 17 января 2020

У меня есть файл .dat, который я понятия не имею о том, как он был создан, какой разделитель использовался и какие-либо подробности о нем. У меня просто есть соответствующий ему mdf и csv файл. Это все. Есть ли способ в python прочитать этот файл .dat?

Несколько способов, которые я пробовал:

file = "736_2_PerformanceCurve_(23_0C)_(13_5V).dat"
datContent = [i.strip().split() for i in open(file, encoding='latin1').readlines()]
datContent

, который дает вывод

[['|CF,2,1,1;|CK,1,3,1,1;'],
 ['|NO,1,7,1,0,,0,;'],
 ['|NL,1,10,1252,0x407;'],
 ['|CT,1,41,0,6,Bench#,24,Korrosionstest', '15A046-01,0,;'],
 ['|CT,1,30,0,11,StartOfTest,8,06/30/17,0,;'],
 ['|CT,1,58,0,10,ResultPath,36,c:\\korrosionstest\\daten\\#170161-OR02,0,;'],
 ['|CT,1,59,0,11,GraphicPath,36,c:\\korrosionstest\\daten\\#170161-OR02,0,;'],
 ['|CT,1,31,0,15,GraphicBaseName,5,736_2,0,;'],
 ['|CT,1,26,0,10,PartNumber,5,736_2,0,;'],
 ['|CT,1,31,0,9,VA-Nr.', 'GS,11,170161-OR02,0,;'],
 ['|CT,1,62,0,9,VA-Nr.',
  'CC,42,TO_ENV_2017_G2_C1_Platform_CC-122164-03-08,0,;'],
 ['|CT,1,24,0,6,Tester,8,Behrendt,0,;'],
 ['|CT,1,32,0,15,Test', 'Department,6,GS/ETR,0,;'],
 ['|CG,1,5,1,1,1;'],
 ['|CD,1,16,1E-2,1,1,s,0,0,0;'],
 ['|NT,1,27,30,', '6,2017,14,25,15.8050001;'],
 ['|CC,1,3,1,1;'],
 ['|CP,1,16,1,2,4,16,0,0,1,0;'],
 ['|Cb,1,33,1,0,1,1,0,11718,0,11718,1,5E-3,0,;'],
 ['|CR,1,30,1,6.103888176768602E-3,0,1,1,A;'],
 ['|CN,1,28,0,0,0,16,ai_iB1_Strom_ECU,0,;'],
 ['|CG,1,5,1,1,1;'],
 ['|CD,1,16,1E-2,1,1,s,0,0,0;'],
 ['|NT,1,27,30,', '6,2017,14,25,15.8050001;'],
 ['|CC,1,3,1,1;'],
 ['|CP,1,16,2,2,4,16,0,0,1,0;'],
 ['|Cb,1,37,1,0,2,1,11718,11718,0,11718,1,5E-3,0,;'],
 ['|CR,1,30,1,3.662332906061161E-3,0,1,1,V;'],
 ['|CN,1,31,0,0,0,19,ai_iB1_Spannung_UBB,0,;'],

соответствующий CSV-файл для того же

[! [введите описание изображения здесь] [1]] [1]

РЕДАКТИРОВАТЬ:

from asammdf import MDF
dat_file = r"C:\Users\HPO2KOR\Desktop\Work\data1.dat"
mdf_file = r"C:\Users\HPO2KOR\Desktop\Work\data1.mdf"
df = mdf.to_dataframe()
mdf = MDF(mdf_file)
df.head()

что дает мне [! [введите описание изображения здесь] [2]] [2]

Как мне прочитать те же данные из файла данных, есть ли библиотека или код для того же самого?

Ответы [ 2 ]

3 голосов
/ 17 января 2020

Если я смотрю на файл, он выглядит как определенный c формат.

Один блок данных начинается с | и заканчивается ;. В блоке данных данные разделяются на ,. По сути, это как CSV, но новая строка - ;.

Теперь с помощью регулярных выражений вы можете прочитать эти данные следующим образом:

import re

with open("resources/input.dat") as f:
    lines = f.readlines()
    text = "".join(lines)

regex = r"\|(.*?);"
matches = re.finditer(regex, text, re.MULTILINE | re.DOTALL)


data = []

for matchNum, match in enumerate(matches, start=1):
    for group in match.groups():
        data.append(group.split(","))

for d in data:
    print(d)

Ввод

|CF,2,1,1;|CK,1,3,1,1;
|NO,1,7,1,0,,0,;
|CT,1,41,0,6,Bench,24,Korrosionstest', '15A046-01,0,
otherline_data;

Вывод

['CF', '2', '1', '1']
['CK', '1', '3', '1', '1']
['NO', '1', '7', '1', '0', '', '0', '']
['CT', '1', '41', '0', '6', 'Bench', '24', "Korrosionstest'", " '15A046-01", '0', '\notherline_data']

Как видите, даже если блок данных не заканчивается новой строкой, вы все равно получите данные до определенной конечной отметки ;.

Редактировать

Я скачал ваш .dat файл. Как вы можете видеть после строки 1133, есть странные символы, которые вообще не имеют смысла. Эти символы или, скорее, байты, вероятно, являются информацией, которая вам необходима для обработки данных в начале. По сути это выглядит как сжатые данные с необходимой исходной информацией, которую я сообщил вам в комментарии.

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

Я не думаю, что кто-то здесь может ответить вам на это. И я не знаю как. Это слишком точно c, и поэтому лучше go, где вы получаете данные.

Фрагмент из файла .dat: (всего 32404 строки и только 1133 с данными) enter image description here

0 голосов
/ 17 января 2020

Вы можете использовать следующий код:

infile = open('.input.dat', 'r')
for line in infile:
    # Typical line: variable = value
    variable, value = line.split('=')
    variable = variable.strip()  # remove leading/traling blanks
infile.close()

Более подробная информация здесь: чтение файла

...