2017-03-06 3 views
0

Ich möchte eine Struktur in IDL erstellen und die Informationen aus meiner ASCII-Datei. Das Problem ist, dass ich mehrere ASCII-Dateien habe und immer die Anzahl der Spalten und Zeilen unterschiedlich sind. Zum Beispiel habe ich die ASCII-Datei "data.dat" und hat 50 Zeilen und 2040 Spalten. Ich weiß, dass wir die Datenstruktur definieren können (wenn wir ich nur 5 Spalten annehmen müssen):Erstellen Sie eine Struktur in IDL

datastruct = { col1:0L, col2:0.0, col3:0.0, col4:0.0, col5:0.0} 

ich meine Datei lesen und dann die Struktur replizieren:

file = 'data.dat' 
nrows = file_line(file) ; to estimate the number of rows 
data = replicate(datastruct, nrows) 
openr, lun, file, /GET_LUN 
readF, lun, data 
free_lun, lun 

ich tun kann: print, data.col1 oder print, data.col2 und so weiter ... aber das wird geben mir nur die ersten 5 Spalten. Wie kann ich das selbe aber für 2040 Spalten machen und auch wenn wir die Anzahl der Spalten in der Datei nicht im Voraus wissen.

Die reale Datendatei enthält Flüsse von mehreren Sternen, die an verschiedenen Tagen mit entsprechenden Fehlern beobachtet wurden. Die Tabelle hat keine Kopfzeile.

Tage Flux1 Err1 FLUX2 Err2 Flux3 Err3 .............. Flux2040 Err2040

Vielen Dank für Ihre Hilfe!

+0

Welche Art von Daten sind das? Numerisch? Gemischte Typen? Haben sie eine Überschrift? – lbusett

+0

Ja numerisch. Die reale Datendatei enthält Flüsse von mehreren Sternen, die an verschiedenen Tagen mit entsprechenden Fehlern beobachtet wurden. Die Tabelle hat keine Kopfzeile. Tage Flux1 Err1 Flux2 Err2 Flux3 Err3 .............. Flux2040 Err2040 –

+0

Also jede Datei hat 2n + 1 Datensätze: einen für Datum und n jeweils für Flüsse und Fehler, richtig? – lbusett

Antwort

1

Wenn eine numerische Matrix ok ist für Sie als eine Struktur instrad, da Sie richtig ASCII-Dateien formatiert haben, eine einfache Lösung einfach sein würde, verwenden read_ascii:

infile = "C:\Users\LB_laptop\Downloads\phot.avg.1.0" 
data = read_ascii(infile) 
data = data.FIELD001 

das gibt Ihnen eine numerische Matrix, einfach damit umgehen. Zum Beispiel:

IDL> data[0:5,0:10] 
     2457454.3  1.6190000    NaN  0.52709073  25.695290  0.20502000 
     2457455.3  1.8770000    NaN  0.14101060  27.126869  0.71034002 
     2457499.5  1.2810000    NaN  0.63232613  25.497650  0.17557999 
     2457500.3  1.5319999    NaN  0.41562101  25.953260  0.25950000 
     2457519.5  1.3420000    NaN  0.38020891  26.049940  0.28159001 
     2457525.3  1.2880000    NaN  0.29697639  26.318199  0.35189000 
     2457528.3  1.3510000    NaN  0.41356701  25.958639  0.26128000 
     2457529.3  1.3300000    NaN  0.36875120  26.083170  0.28975999 
     2457530.3  1.3400000    NaN  0.41647339  25.951031  0.25999999 
     2457533.3  1.3120000    NaN  0.33893269  26.174721  0.19237000 
     2457534.3  1.2800000    NaN  0.38690910  26.030979  0.15137000 
+0

Wunderbar !! Es ist sehr schnell und funktioniert perfekt! Sobald ich Zeit habe, werde ich versuchen, dasselbe herauszufinden, aber mit Strukturen. Vielen dank für Deine Hilfe. –

+1

Ich weiß nicht, ob es direkt mit Strukturen möglich ist, da ich denke, dass du vorher die "Größe" kennen solltest. Sie könnten jedoch leicht eine Struktur für jeden Stern durch eine for-Schleife erstellen und sie dann in einem einzigen Array von Strukturen unter Verwendung von Strukturmanipulationsroutinen (http://www.sos.siena.edu/~jmoustakas/idl_tutorials/tutorial_structures) zusammenfügen. html) – lbusett

Verwandte Themen