I dati, a parte un primo header innocuo, che comunque inizia sempre con //
, sono costituiti da blocchi omologhi e contigui, il cui inizio è
Board 0
TS=79663.288 us
TrgID=0
CH Cnt
00 2762
01 3366
02 3475
e la fine è
60 2110
61 2203
62 2395
63 2116
----------------------------------
quindi subito dopo attacca un nuovo blocco identico
ATTENZIONE: MANCA IL CANALE 28
Questo script funziona facendo il parsing del file linea per linea, dando per scontato che la struttura a blocchi sia garantita, e che il bug del canale 28 sia onnipresente, in poche parole che ci siano sempre 63 canali
Traccia Parsing:
TS
si memorizza il corrispondente tempoCH
, sa che dovrà leggersi le successive 63 righeCH
. Evetuali TS
sono sempre intercettatiVariabili:
import numpy as np
import os
import time
t = time.time()
# Complessivo di tutti i files
listonaTS = []
listonaCnt = []
dataIncoming = False
cntRow = 0
# Ciclo su tutti i files che ho messo nella cartella "data"
for myFile in os.scandir(r".\data"):
if myFile.name.split(".")[-1] != "txt": continue
# Per ciascun file
listaTS = [] # Vettore che conterrà i TS
listaCnt = [] # Vettore che contiene i vettori dei conteggi per ciascun file
# Apro il file in questione
with open(myFile) as f:
# Ciascun blocco
tmpListaCnt = []
for myLine in f:
# Se sono ad un TS mi memorizzo il tempo
if myLine[:3] == "TS=":
myTS = myLine.split("=")[1].split(" ")[0]
listaTS.append(float(myTS))
# Se trovo un CH so che devo leggere 64 righe complessive
if myLine[:2] == "CH":
dataIncoming = True
cntRow = 0
continue
# Se il blocco prima mi ha comunicato che sono in arrivo dati
if dataIncoming & (cntRow >= 0) & (cntRow <= 63):
#print(cntRow, myLine)
myCnt = myLine.split("\t")[-1]
tmpListaCnt.append(int(myCnt))
cntRow += 1
# Se ho letto 63 righe, è finita la pacchia
# ATTENZIONE, MANCA IL CANALE 28
if cntRow == 63:
dataIncoming = False
listaCnt.append(np.array(tmpListaCnt).copy())
tmpListaCnt = []
# File finito: mi esporto le cose di interesse come vettori numpy per comodità
listaTS = np.array(listaTS)
listaCnt = np.array(listaCnt)
listonaTS.append(listaTS.copy())
listonaCnt.append(listaCnt.copy())
print(f"Elapsed time: {time.time()-t:.2f} s")
Elapsed time: 3.02 s
Esempio di accesso alla info: il primo indice di una listona è relativo al file, il secondo al blocco
idxFile = 0
idxBlocco = 1
listonaCnt[idxFile][idxBlocco]
array([2724, 3337, 3356, 2221, 3319, 4495, 4318, 2967, 5941, 6486, 2084, 2318, 5050, 3581, 2246, 3126, 3105, 2400, 2629, 2007, 2950, 3073, 1846, 2715, 2525, 2763, 3253, 3365, 3331, 0, 2473, 2789, 2514, 2718, 2613, 3519, 3630, 2630, 2284, 3055, 2265, 2445, 3029, 5222, 3225, 2483, 2249, 2248, 2612, 8517, 1841, 3167, 3066, 3441, 2336, 3042, 2300, 2641, 2596, 2150, 2185, 2456, 2192])
type(listonaCnt[idxFile][idxBlocco])
numpy.ndarray
# I 63 canali di questo blocco relativo a questo file
listonaCnt[idxFile][idxBlocco].shape
(63,)
# Tutti i blocchi di questo file
listonaCnt[idxFile].shape
(3600, 63)
type(listonaTS[idxFile])
numpy.ndarray
# I 3600 tempi di questo file
listonaTS[idxFile].shape
(3600,)