IDL 8.4를 사용하고 있습니다. read_csv()로 읽은 입력 타입을 결정하기 위해 isa() 함수를 사용하고 싶다./정수,/정수,/float 및/문자열을 일부 필드로 사용하고 싶습니다. 부동 소수점 숫자를 정수로 지정하고 다른 숫자는 상관하지 않으려합니다. 나는 이렇게 할 수는 있지만 인간의 눈에는별로 읽을 수 없다.idl : 동적으로 키워드를 구조를 테스트하는 isa 함수에 전달합니다. read_csv
str = read_csv(filename, header=inheader)
; TODO check header
if not isa(str.(0), /integer) then stop
if not isa(str.(1), /number) then stop
if not isa(str.(2), /float) then stop
'/ 정수'문자 그대로대로 나는, 내가 위에서
expected_header = ['id', 'x', 'val']
expected_type = ['/integer', '/number', '/float']
str = read_csv(filename, header=inheader)
if not array_equal(strlowcase(inheader), expected_header) then stop
for i=0l,n_elements(expected_type) do
if not isa(str.(i), expected_type[i]) then stop
endfor
이 작동하지 않음과 같은 일을 할 수있는 희망, 그리고 난라는 이름의 구조를 찾고있다() ISA를 같아요. 비슷한 것을 어떻게 할 수 있습니까?
이상적으로 파일에서 읽은 헤더를 기반으로 예상되는 유형을 선택하므로 헤더가 예상 필드를 지정하는 한 스크립트는 계속 작동합니다.
편집 :
내 임시 해결책은 ISA에 대한 래퍼를 작성하는 것입니다(). 별로 예쁘지는 않지만 내가 원하는 것을 수행합니다 ... 깨끗한 해결책이 있다면 알려주세요.
또한 read_csv는 long, long64, double 및 string 중 하나만 반환하도록 정의되어 있으므로이 제한으로 테스트 할 함수를 작성할 수 있습니다. 하지만 나는 다른 비슷한 경우에 그들을 재사용 할 수 있도록 일반적으로 작동하도록 만들고 싶었습니다.
function isa_generic,var,typ
; calls isa() http://www.exelisvis.com/docs/ISA.html with keyword
; if 'n', test /number
; if 'i', test /integer
; if 'f', test /float
; if 's', test /string
if typ eq 'n' then return, isa(var, /number)
if typ eq 'i' then then return, isa(var, /integer)
if typ eq 'f' then then return, isa(var, /float)
if typ eq 's' then then return, isa(var, /string)
print, 'unexpected typename: ', typ
stop
end
답장을 보내 주셔서 감사합니다! 이 _extra는 제가 찾고 있었던 것 같습니다. create_structure에서 가치 1의 의미는 무엇입니까? 다른 값, 문자열 등으로 시도했지만 무시되는 것 같습니다. 올바른 태그가있는 구조를 만들려면 그냥 자리 표시 자입니까? – yosukesabai
@yosukesabai 값 1이 키워드의 값으로 전달됩니다. IDL은'/ number' 나'/ float'와 같은 슬래시와 함께 키워드를 전달할 때 키워드의 값에 대해 1의 비트 값 (1S)을 16 비트 정수로 전달합니다. 즉,'result = isa (value,/integer) 'IDL 문은'result = isa (value, integer = 1S)'를 작성하기위한 바로 가기입니다. –
감사합니다. 한 가지 더 좋은 점은 알고 있어야합니다. – yosukesabai