readf 데이터읽기..

게시판 IDL Q&A readf 데이터읽기..

태그: 

4 답변 글타래를 보이고 있습니다
  • 글쓴이
    • #1991 Reply
      kogodkr
      회원

      수고많으십니다.
      데이터자료랑 코드랑해서 질문 다시 올렸어요

      해역 정선.정점 위도 경도 관측일시 관측수심(m) 수온(℃)
      동해 102.00 36.0767 129.5883 2013.12.17 02:52 0 14.06
      동해 102.00 36.0767 129.5883 2013.12.17 02:52 10 14.07
      동해 102.00 36.0767 129.5883 2013.12.17 02:52 20 14.01
      동해 102.00 36.0767 129.5883 2013.12.17 02:52 30 13.76
      동해 102.00 36.0767 129.5883 2013.10.30 07:55 0 19.71
      동해 102.00 36.0767 129.5883 2013.10.30 07:55 10 19.72
      동해 102.00 36.0767 129.5883 2013.10.30 07:55 20 19.78
      동해 102.00 36.0767 129.5883 2013.10.30 07:55 30 19.3

      fl = file_lines(fn)

      loc=fltarr(fl-1) ;정선.정점
      lat=fltarr(fl-1) ; 위도
      lon=fltarr(fl-1) ; 경도
      mm=intarr(fl-1) ; 시간
      depth=intarr(fl-1) ; 깊이
      temp=fltarr(fl-1) ; 수온

      close,1&openr,1,fn

      head=’ ‘
      readf,1,head

      i=0
      while(not eof(1)) do begin
      readf, 1, x1,x2,x3,x4,x5,x6, format='(4x,F6.2,2x,f7.4,2x,f8.4,7x,i2,11x,i3,2x,f5.2)’
      loc(i)=x1
      lat(i)=x2
      lon(i)=x3
      mm(i)=x4
      depth(i)=x5
      temp(i)=x6

      i=i+1

      endwhile

      close,1
      end

      소수점들이 읽어지지않고, 엉뚱한 컬럼들이 읽어지고있어요.

      loc배열속 데이터들 소수점이 다 .000이고요
      lat,lon배열 데이터는 소수 둘째자리가 0으로 되어있어요

      나머지 배열들은 제가 원하지않는 컬럼 데이터가 읽어져서
      mm배열에는 ‘월’만 넣으려고했는데 3으로 채워져있고요
      depth배열는 한자리수로만 채워져있고

      데이터자료는 보시는데로 정리가 잘 되있는데
      엉뚱한 값들이 읽어져요 ㅠㅠ

    • #1992 Reply
      Sangwoo
      회원

      제 생각에는 그냥 READCOL로 처리하는 것이 가장 좋을 것 같습니다. 이 데이터를 보면 컬럼들 사이사이가 공백으로 나눠져 있는 것은 분명하고 일관된 특성인데 반하여, 각 컬럼이 차지하는 칸의 수가 일정하지가 않습니다. 예를 들면 수심에 해당되는 0, 10, 20에 해당되는 부분이 0일 때에는 한 칸이고 10일 때에는 두 칸입니다. 그렇다면 위에 올리신 내용과 같이 X, I 기술자의 필드수가 고정적이면 엉뚱한 자리를 읽는 경우가 생길 수 밖에 없습니다. 이런 경우에 대한 대비책을 고민하는 것보다는 차라리 READCOL로 모든 컬럼들을 배열로 읽고, 각 배열에 대해서 필요한 처리를 거쳐 원하는 값을 뽑아내는 방식이 더 효율적입니다.

    • #1994 Reply
      kogodkr
      회원

      감사합니다 ㅋㅋ
      금방 해결됬어요

    • #5346 Reply
      yelim
      회원

      안녕하세요! 질문이 있는데요

      저도 저런 형식의 자료를 readcol로 읽으려고 했는데

      일:월:년 으로 된 자료를 인식을 못하더라고요

      % READCOL: ERROR – No valid lines found for specified format
      % PRINT: Variable is undefined: DATE.

      이런 오류가 나는데 어떻게 해야할까요?

      • #5347 Reply
        Kyecw
        회원

        기본적으로 readcol 프로시져는 아무런 설정 없이 사용할 경우, 읽는 자료를 float, 구분자(delimiter)를 공백으로 인식하여 자료를 읽게 설정되어있습니다.
        헌데 말씀해주신 일:월:년의 형식으로 날짜값이 자료안에 끼어들어가 있을 경우, 해당 날짜값이 작성된 컬럼에는 float 형식으로 읽을 수 있는 실수값이 작성되어있지 않으므로 readcol 프로시져가 해당 라인을 헤더 또는 잘못된 값이 저장된 라인으로 인식하여 건너뛰게 됩니다.

        따라서 자료를 읽고싶으시다면 해당 날짜값이 작성된 순번의 컬럼을 읽는 자료 형식을 string으로 지정해주거나 delimiter를 지정해주는 방법을 사용하셔아합니다.

        만약 읽으시려는 자료의 구성이 일:월:년로만 되어있어서 년, 월, 일을 다른 변수로 읽고 싶은 상황이라면 readcol 구문에 delimiter = ‘:’를 추가해주시는 것으로 해결할 수 있습니다.

        또는 자료의 구성이 년:월:일로 구성된 날짜값이 들어있고, 다른 값들이 실수로 저장되어있는 경우, format 옵션을 이용하여 날짜값이 들어있는 컬럼의 자료 형식을 string을 의미하는 A로, 다른 자료들이 들어있는 컬럼의 자료 형식을 float를 의미하는 F로 지정하시면 됩니다.

    • #5348 Reply
      yelim
      회원

      자세한 답변 감사합니다!

      제가 가진 자료가 일:월:년,실수,실수, 이런 식인데

      file=filepath(‘data.lev15’, subdirectory=[‘examples’,’data’])

      FMT = ‘A, X, X, X, X, X, X, X, X, F, X, X, F, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, F, X, X, X, X, X, X, X’

      readcol, file, F=FMT, date, AOT_551, AOT_500, AE, DELIMITER=’,’, /PRESERVE_NULL, /NAN

      이렇게 읽으려고 했더니 다 스킵합니다 ㅠㅠ 컬럼이 40개가 넘어서 그런걸까요..?

      • #5349 Reply
        Kyecw
        회원

        readcol 프로시져에서 delimiter 및 포맷을 지정해 줬다면 굳이 포맷에 공백을 명시해줄 필요는 없습니다.
        자료 컬럼이 총 3개이므로 FMT = ‘(A, F, F, F)’면 충분할 것 같습니다.

        또는 제시해주신 자료가 csv형식으로 되어있으므로 read_csv 함수를 사용하시는 것도 괜찮습니다.
        read_csv의 사용법은 IDL 도움말을 참조하시면 도움이 되실겁니다.

4 답변 글타래를 보이고 있습니다
'readf 데이터읽기..'에 답변달기
글쓴이 정보: