IDL 8.5是否能够读取包含字符串,日期和值的表格?

时间:2016-12-27 16:10:41

标签: idl-programming-language

我在IDL场景中非常新,我在问题上挣扎了几个小时,我希望你能帮助我:

所以现在我正在尝试从表中读取数据(“file.txt”)。我想,每列都保存在一个变量中(我考虑过使用STRARR)

我找到了这个教程:http://www.idlcoyote.com/tips/ascii_column_data.html

当您想要读取每列的数字时,这非常有用,效果很好。 这是上面教程中的表格:

教程表:

Experiment 01-14-97-2b9c
No. of Data Rows: 5
Temperature         Pressure          Relative Humidity
  20.43             0.1654                 0.243
  16.48             0.2398                 0.254
  17.21             0.3985                 0.265
  18.40             0.1852                 0.236
  21.39             0.2998                 0.293

代码:

OPENR, lun, "tutorial.txt", /GET_LUN
header = STRARR(3)
READF, lun, header

data = FLTARR(3, 5)
READF, lun, data
temperature = data(0,*)

print, data
print, temperature

输出数据:

  20.4300     0.165400     0.243000
  16.4800     0.239800     0.254000
  17.2100     0.398500     0.265000
  18.4000     0.185200     0.236000
  21.3900     0.299800     0.293000

输出温度:

  20.4300
  16.4800
  17.2100
  18.4000
  21.3900

对于数字看起来相当不错。 但是当我有日期,时间和数字的字符串时,如下所示:

我的表:

Experiment 01-14-97-2b9c
No. of Data Rows: 5
Date              Start time             End time             Value
12-Feb-2002       05:08:10               06:08:30             20
08-Mar-2002       07:35:38               09:25:59             100
20-Jun-2002       12:30:35               16:15:18             5536
25-Jul-2002       04:02:06               07:02:58             5822
02-Aug-2002       23:30:25               23:55:22             456

上面的代码将不再有效。当我使用此my_var= data(0,*)时,整个数据将保存在变量my_var中,当然因为数据不再是列,而是整行。

FLTARR正在设置此数据

12-Feb-2002       05:08:10               06:08:30             20

到这个结果(当然因为 FLT arr)

12.0000
5.00000
6.00000
20.0000

STRARR正在my_var保存好数据,但不分隔列。

我想要的是什么:

我想在一个变量中包含每一列,以便稍后我可以在另一个代码中处理这些变量数据。

dates = data(0,*)
starts = data(1,*)
ends = data(2,*)
values = data(3,*)

print, starts

输出: 开始时间

05:08:10
07:35:38
12:30:35
04:02:06
23:30:25

(以及其他变量)

我希望你能在这里提供帮助。 也许我误会了什么,如果是的话请让我知道。

对于任何其他建议或解决方案,我将不胜感激。

提前致谢!

1 个答案:

答案 0 :(得分:1)

我的建议是以某种方式使用STRSPLIT,在您阅读时或在结尾处使用每一行。

以下是最后完成所有操作的示例。首先,将数据读入data数组(忽略header数组):

IDL> openr, lun, 'file.txt', /get_lun
IDL> header = strarr(3)
IDL> readf, lun, header
IDL> data = strarr(5)
IDL> readf, lun, data
IDL> free_lun, lun

然后拆分空白:

IDL> tokens = strsplit(data, /extract)

最后,按位置提取元素:

IDL> dates = (tokens.map(lambda(x: x[0]))).toarray()
IDL> starts = (tokens.map(lambda(x: x[1]))).toarray()
IDL> ends = (tokens.map(lambda(x: x[2]))).toarray()
IDL> values = (tokens.map(lambda(x: long(x[3])))).toarray()

您现在已经掌握了自己的价值观:

IDL> help, dates, starts, ends, values
DATES           STRING    = Array[5]
STARTS          STRING    = Array[5]
ENDS            STRING    = Array[5]
VALUES          LONG      = Array[5]
IDL> print, values
          20         100        5536        5822         456

更新:确保您已完成

IDL> compile_opt strictarr

在这些命令之前的范围内。

更新:按value排序这些数组:

IDL> ind = sort(values)
IDL> values = values[ind]
IDL> dates = dates[ind]
IDL> starts = starts[ind]
IDL> ends = ends[ind]