在IDL

时间:2017-03-06 19:47:01

标签: idl-programming-language

我想在IDL中创建一个结构并从我的ASCII文件中提取信息。问题是我有几个ASCII文件,总是列数和行数不同。例如,我有ASCII文件“data.dat”,有50行和2040列。我知道我们可以定义数据结构(如果我们假设我只有5列):

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

我可以阅读我的文件,然后复制结构:

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

我可以:print, data.col1print, data.col2等等......但这会只给我前5列。我如何能够做到2040列,以及我们事先不知道文件中的列数。

真实数据文件包含在不同日期观察到的具有相应错误的几颗恒星的通量。该表没有标题。

天Flux1 Err1 Flux2 Err2 Flux3 Err3 .............. Flux2040 Err2040

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

如果一个数字矩阵对于你来说比一个结构更合适,因为你有正确格式化的ASCII文件,一个简单的解决方案就是使用infile = "C:\Users\LB_laptop\Downloads\phot.avg.1.0" data = read_ascii(infile) data = data.FIELD001

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

这为您提供了一个易于处理的数字矩阵。例如:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.MenuBar?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.112" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sopraFx.extended.view.UserEditView">
    <children>
        <MenuBar layoutY="2.0" prefHeight="32.0" prefWidth="507.0">

        </MenuBar>
        <Button fx:id="logoutButton" layoutX="506.0" layoutY="2.0" mnemonicParsing="false" onAction="#handleCloseButtonAction" prefHeight="31.0" prefWidth="92.0" text="Zurück" />
      <TextField fx:id="tableEditName" layoutX="369.0" layoutY="59.0" prefHeight="31.0" prefWidth="124.0" promptText="Username" />
      <TextField fx:id="tableEditPassword" layoutX="369.0" layoutY="115.0" prefHeight="31.0" prefWidth="124.0" promptText="Password" />
      <TextField fx:id="tableEditEmail" layoutX="369.0" layoutY="165.0" prefHeight="31.0" prefWidth="124.0" promptText="E-Mail" />
      <Button fx:id="editButton" defaultButton="true" layoutX="527.0" layoutY="363.0" mnemonicParsing="false" text="Save" />
      <Label layoutX="14.0" layoutY="64.0" text="you want to edit" />
      <TableView fx:id="userEditTable" layoutX="6.0" layoutY="34.0" prefHeight="311.0" prefWidth="286.0">

      </TableView>
    </children>
</AnchorPane>