Может ли IDL 8.5 читать таблицы со строками, датами и значениями?
Я очень новичок на сцене 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 обр)
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 ответ
Мое предложение будет использовать 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]