|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jan 2006
Città: Pisa
Messaggi: 2498
|
[Linguaggio di scripting qualsiasi] "Lavoretto" su un file binario
Ciao a tutti!
Per esigenze universitarie mi trovo a lavorare su un file binario prodotto dal data system di un gas cromatografo. Cio' che devo estarvi e' un semplice cromatogramma, che per quanto ci interessa e' una grafico di una qualche intensita' in funzione del tempo. Quello che sputa il programma fuori e' un file binario, che contiene: - una parte di intestazione; - una parte che contiene i dati, fatta cosi: ![]() Io la interpreto questo modo: quattro doppiette di numeri fanno un'intensita'. Il file non specifica a che tempo viene preso il dato, perche' assume di prendere il primo dato a t=0, poi campiona un dato ogni secondo. - una parte di chiusura. Ora, quello che dovrei fare io e' prendere uno di questi file, aprirlo, strippare via la parte di intestazione (eventualmente recuperando qualche informazione, convertendola in testo), poi prendere la parte dei dati effettivi e convertirla in un file csv. Mi date un aiutino su come potrei fare? ![]() Conoscicchio il PHP e non ho problemi a metter su un server locale per fare il lavoro, ma non so se con quello si possa fare. Ale
__________________
![]() |
![]() |
![]() |
![]() |
#2 | ||
Senior Member
Iscritto dal: Nov 2004
Città: Padova
Messaggi: 2342
|
Quote:
Quote:
![]() Comunque è fattibile con tutti i linguaggi che permettono di leggere un file, ovvero una infinità ![]() Java, C#, Python, C, C++...
__________________
CPU Ryzen 2600 @ 3,95Ghz + Bequiet Dark Rock TF / MB Asus X470-F Gaming / RAM 2x8GB DDR4 G.Skill FlareX 3200 CL14 / VGA Sapphire RX 7900 XT Nitro+ @ 3200Mhz / SSD Samsung 970 Pro 512GB + Sandisk 240GB Plus + Sandisk 960GB Ultra II PSU Seasonic Platinum P-660 / Headset Kingston HyperX Flight |
||
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Jan 2006
Città: Pisa
Messaggi: 2498
|
Quote:
![]() Quello che mi manca e' capire come fare ad aprire il file "in binario", e a leggere i blocchi di quattro doppiette. Che poi non so se aprendolo il binario il file legga le doppiette esadecimali. Leggera' il binario, no? ![]()
__________________
![]() |
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
In Python è banale. Ti faccio alcuni esempi:
Codice:
import struct # Importo il modulo che mi consente di manipolare strutture C-like struct.unpack('4f', '\x00\x00\x25\x9d\x00\x00\x05\xb4\x00\x00\x05\xb3\x00\x00\x05\xb3') struct.unpack('4i', '\x00\x00\x25\x9d\x00\x00\x05\xb4\x00\x00\x05\xb3\x00\x00\x05\xb3') struct.unpack('>4i', '\x00\x00\x25\x9d\x00\x00\x05\xb4\x00\x00\x05\xb3\x00\x00\x05\xb3') Codice:
(-2.183756817139993e-21, -1.2386590242385864e-07, -3.096647560596466e-08, -3.096647560596466e-08) (-1658519552, -1274740736, -1291517952, -1291517952) (9629, 1460, 1459, 1459) Ti scrivo 2 righe al volo per fare lo stesso con un file: Codice:
import struct f = open('ee_003.raw', 'rb') # r = lettura, b = binario f.seek(0x3d0) # Mi posiziono dopo l'intestazione, per iniziare a leggere i dati veri e propri s = f.read(16) # Leggo 16 byte Quartetto = struct.unpack('4f', s) # Spacchetto 4 valori dai 16 byte letti. Il risultato è una tupla (una sorta di array a sola lettura) print Quartetto[0] # Primo valore print Quartetto[3] # Quarto valore ![]()
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Jan 2006
Città: Pisa
Messaggi: 2498
|
Quote:
Un grazie sentititissimo, considera una birra pagata. ![]() Alex
__________________
![]() |
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Jan 2006
Città: Pisa
Messaggi: 2498
|
Dopo una mezz'oretta di smanetto: http://tinypic.com/r/atu9hl/6
So' soddisfazioni, sono riuscito a fare uno scriptino che mi parsa in batch tutta una cartella. In due minuti mi sono risparmiato un viaggio (fisico) fino a Pisa. Grazie ancora a tutti ![]()
__________________
![]() |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
![]() ![]() Quindi in questa mezz'oretta hai pure avuto modo di smanettare col modulo glob per leggere l'elenco dei file di una cartella e, da quel che vedo nell'immagine, pure con quello csv. Che dire: complimenti anche a te. ![]()
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: Jan 2006
Città: Pisa
Messaggi: 2498
|
Quote:
![]() ![]() Qui il codice, per la cronaca Codice:
import os import sys import struct ## Definizione della funzione converti def converti (filename): "Questa funzione effettua la conversione" f = open(filename, 'rb') # r = lettura, b = binario f.seek(0x300) # Mi posiziono circa alla fine dell'intestazione #Cerco il segno di inizio (00 00 00 09) e mi sposto 16x4 byte dopo while 1: z = f.read(4) scarto = struct.unpack('>i', z) if scarto[0] == 9: f.seek(64,1) break sc = open(filename+'.csv','w') sc.write('RT(milliseconds);RT(minutes) - NOT USED BY IMPORT;RI;100\n') sec = 0 while 1: s = f.read(4) # Leggo 4 byte valore = struct.unpack('>i', s) # Spacchetto 1 valore dai 4 byte letti, il ris. va in [0] di una tupla. if valore[0] == 4: break sc.write(str(sec)+";0;0.0;"+str(valore[0])+"\n") # Primo valore sec=sec+200 sc.close() f.close() return #### if len(sys.argv) == 1: for files in os.listdir("."): if files.endswith(".raw"): converti(files) else: converti(sys.argv[1])
__________________
![]() |
|
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Ti capisco, ma la logica di unpack è di interpretare una sequenza di byte e restituire una sequenza di dati (definiti nella stringa di formattazione).
Per cui è logico che restituisca una tupla, che in Python identifica, appunto, una sequenza di informazioni (eterogenee per tipo). Per il resto il codice che hai scritto è ben strutturato, e ho visto che ti sei dato da fare per risolvere i sottoproblemi che ti sono presentati. Per essere il primo programma che scrivi in Python, sei messo decisamente bene; puoi migliorare un po' guardando la libreria standard di Python, che ha parecchia roba interessante che ti mette già a disposizione, senza che debba reinventarti la ruota.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Jan 2006
Città: Pisa
Messaggi: 2498
|
Infatti, provero' a utilizzare il modulo csv e magari provo ad interpretare parte dell'intestazione per produrre un file completo.
Grazie ancora! ![]()
__________________
![]() |
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
A stomaco pieno si ragiona meglio.
![]() Se sei sicuro che la tupla ritornata abbia un solo elemento, potresti utilizzare l'operatore di tuple/list-unpacking. Nel tuo caso, ad esempio: Codice:
scarto, = struct.unpack('>i', z) if scarto == 9: Ovviamente nel caso in cui i valori fossero più d'uno, avresti qualcosa del tipo: Codice:
x, y, z = (1, 2, 3)
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 10:40.