데이터 읽는 방법에 관한 문제

게시판 IDL Q&A 데이터 읽는 방법에 관한 문제

2 답변 글타래를 보이고 있습니다
  • 글쓴이
    • #2826 Reply
      jsh4887
      회원

      안녕하세요..

      제가 이번에 물어볼 질문은 데이터 관련해서 읽는 방법에 대해서 질문 올리겠습니다.

      평소에는 그냥 readcol을 쓰면서 사용하고 있었는데요..

      이번에 받은 데이터는 워낙 불규칙적이고 header부분도 있어 어려움을 겪고 있어 질문을 올립니다.

      우선 데이터 형식을 보여드리면

      1.0 GTEX DATA GNSS GTEX VERSION / TYPE
      RNX2GTEX V1.1.4 NICT, JAPAN PGM / RUN BY
      0 EXPONENT OF TECU
      TEC values in 10^16 el/m^2 (1 TEC Unit) COMMENT
      Types of data = R1 : Raw slant TEC including bias COMMENT
      A1 : Absolute slant TEC COMMENT
      R1 or A1 is necessary COMMENT
      1F : TEC status flag COMMENT
      1O : Observation data used for TEC COMMENT
      ZN : Satellite zenith angle COMMENT
      AZ : Satellite animuth angle COMMENT
      TEC status flag = 0 : Normal data COMMENT
      1 : Lack of observables (TEC=999.) COMMENT
      2 : Too large TEC (TEC=999.) COMMENT
      4 : Cycle slip (TEC discontinuity) COMMENT
      5 : Cycle slip (LLI) COMMENT
      6 : Beginning of arc COMMENT
      BIAS ESTIMATION PGM
      00011670.13o RINEX FILE NAME
      0001 MARKER NAME
      00000 TRIMBLE NETR9 Nav 4.61 Sig 0.00 REC # / TYPE / VERS
      TRM59800.80 GSI ANT # / TYPE
      -3522844.4920 2777142.6413 4518957.4874 APPROX POSITION XYZ
      45.4030 141.7504 0.0725 POSITION LAT LON ALT
      6 L1 C1 L2 P2 S1 S2 # / TYPES OF OBSERV
      5 R1 1F 1O ZN AZ # / TYPES OF DATA
      30.0000 INTERVAL
      2013 6 16 0 0 0.0000000 GPS TIME OF FIRST OBS
      END OF HEADER
      13 6 16 0 0 0.0000000 0 8G15G14G22G18G17G25G12G24 ; yy mm dd hour min sec 위성이름(8G 15G 14G 22G 이런식으로 되어있는거구요)
      a b c d e
      102.0229 6 L1L2C1P2 64.76 119.50 이 값들이 8G
      83.1378 6 L1L2C1P2 51.56 302.90 15G
      58.7729 6 L1L2C1P2 39.62 262.61 14G
      79.2252 6 L1L2C1P2 45.34 209.22 22G
      99.9697 6 L1L2C1P2 82.91 34.78 이런식으로 값이 지정되어있는 것입니다.
      111.2028 6 L1L2C1P2 47.92 183.68
      76.7475 6 L1L2C1P2 25.89 123.28
      102.7566 6 L1L2C1P2 37.80 58.84
      13 6 16 2 1 30.0000000 0 8G14G22G31G32G29G25G12G24
      76.9524 0 L1L2C1P2 11.18 207.92
      99.7028 0 L1L2C1P2 76.72 210.32
      79.7613 0 L1L2C1P2 45.95 290.19
      101.0117 0 L1L2C1P2 70.14 309.43
      102.8105 0 L1L2C1P2 59.85 141.03
      102.8003 0 L1L2C1P2 18.89 59.01
      82.8734 0 L1L2C1P2 58.20 50.18
      999.0000 1 0.00 0.00
      13 6 16 13 38 0.0000000 0 12G12G23G10G17G20G 4G13G11G32G 2G 1G28
      104.3981 0 L1L2C1P2 80.10 328.13
      71.4157 0 L1L2C1P2 56.82 122.59
      105.3421 0 L1L2C1P2 70.37 221.18
      74.8831 0 L1L2C1P2 10.05 255.47
      72.5465 0 L1L2C1P2 32.96 61.52
      92.2620 0 L1L2C1P2 54.19 281.06
      95.9814 0 L1L2C1P2 72.57 147.95
      94.0696 0 L1L2C1P2 82.56 103.44
      89.6131 0 L1L2C1P2 62.11 50.52
      104.1030 0 L1L2C1P2 83.90 275.82
      120.6920 0 L1L2C1P2 65.01 84.34
      95.8772 0 L1L2C1P2 72.24 205.42

      이런식으로 되어있긴 한데요..
      header 부분에서는 POSITION LAT LON ALT 이부분이 필요해서 이부분은 전체를 다읽어서 strmid를 써서 뽑아냈구요

      그래서 제가 최종적으로 하고 싶은것은

      time a b d e 이런식의 배열을 재배치하는 것인데(c는 필요가 없습니다.)

      문제가 L1L2C1P2 이게 없는 부분이 있고 저 위성값들이 다 붙어있는 경우가 있고(ex 8G15G14G22G18G17G25G12G24)부분적으로 떨어져있는 경우가 있더라구요..(12G12G23G10G17G20G 4G13G11G32G 2G 1G28) 그리고 지금 제가 짠 코드를 보여드리면

      ; c=0
      ; oneline = ”
      ; onerecord = {hour:”, mmin:”, sec:”, PRN:”, TEC_bias:0.0, flag:0, elev_ang:0.0, azi:0.0}
      ; records = replicate(onerecord, 100000L)
      ;
      ; openr, 1, filename
      ; while ~eof(1) do begin
      ; readf, 1, oneline
      ; if strmid(oneline, 1, 9) eq string(’13 6 16′) then begin
      ; hour = strmid(oneline, 10, 3)
      ; mmin = strmid(oneline, 13, 3)
      ; sec = strmid(oneline, 16, 2)
      ; PRN = strmid(oneline, 30, strlen(oneline))
      ; endif else begin
      ; TEC_bias = (strsplit(oneline, /extract))[0]
      ; flag = (strsplit(oneline, /extract))[1]
      ; elev_ang = 90 – (strsplit(oneline, /extract))[2]
      ; azi = (strsplit(oneline, /extract))[3]
      ;
      ; records[c] = onerecord
      ; c++
      ; endelse
      ; endwhile
      ; close,1
      ;
      ; records = records[0:c-1]

      print, ‘Done!’
      end

      이런 식으로 짰는데 한줄씩 읽어서 저장하는 식으로 했으나 header 부분부터 읽어서 그런지 오류가 나더라구요..

      혹시 또다른 방법이 있는지 부탁드립니다.ㅜㅜ

      • 이 게시글은 jsh4887에 의해 7 years, 11 months 전에 수정됐습니다.
    • #2828 Reply
      mwkim
      회원

      안녕하세요.

      보여주신 문제를 보면 다루고자 하는 자료가 정형화 되지 않아서 어려움을 겪고 계신데요.

      대략 2가지 방법이 있을 것 같습니다.

      하나는 전처리 과정을 통해서 자료를 정형화를 하거나(즉 말씀하신 L1L2C1P2가 없는 부분에 L1L2C1P2를 넣는 등)

      아니면 처리 과정에서 예외 규정을 두어야 할 것 같습니다.

      전자의 경우는 전처리 프로그램을 별도로 작성하셔야 하고,

      후자의 경우는 처리 과정을 진행하는 코드는 지금보다 길어질 것 입니다.

      이 부분에 있어서는 어떤 방법을 사용하라고 권하기 보다는 개발하기 편한 방식으로 하시면 될 것 같습니다.

      참고로 정형화되지 않은 자료에 대해 지원하는 함수는 IDL외에도 다른 프로그램에서도 지원하는 기능은 극히 드물기 때문에 위와 같은 과정은 작성자 분께서 만드셔야 할 것 입니다.

      에러가 나는 부분에 대해서는 어디서 어떤 에러가 났는지 구체적으로 작성해주시면 답변드릴 수 있을 것 같습니다.
      (예제를 올려주셨는데, 헤더 처리하는 부분은 예제 코드에 없는것 같아서…)

      • #2829 Reply
        jsh4887
        회원

        답변 감사합니다~

        일단 헤더부분에 대해서는 현재 처리를 한 상태이구요

        이건 좀 다른 질문이긴 한데

        혹시 저 위의 데이터

        13 6 16 2 1 30.0000000 0 8G14G22G31G32G29G25G12G24
        76.9524 0 L1L2C1P2 11.18 207.92
        99.7028 0 L1L2C1P2 76.72 210.32
        79.7613 0 L1L2C1P2 45.95 290.19
        101.0117 0 L1L2C1P2 70.14 309.43
        102.8105 0 L1L2C1P2 59.85 141.03
        102.8003 0 L1L2C1P2 18.89 59.01
        82.8734 0 L1L2C1P2 58.20 50.18

        이 부분을

        76.9524 0 11.18 207.92 G14 2 1 30.0000000
        99.7028 0 76.72 210.32 G22 2 1 30.0000000
        79.7613 0 45.95 290.19 G31 2 1 30.0000000
        101.0117 0 70.14 309.43 G32 2 1 30.0000000
        102.8105 0 59.85 141.03 G29 2 1 30.0000000
        102.8003 0 18.89 59.01 G12 2 1 30.0000000
        82.8734 0 58.20 50.18 G24 2 1 30.0000000

        이런식으로 바꿀수 있을까요? L1L2C1P2 없애는 부분까지는 했고 8G14G22G31G32G29G25G12G24이 부분도 strsplit을 통해서 쪼개는 것까지 하였는데 저와 같은 형식으로 만들지는 못하겠더라구요..

        저게 8G14G22G31G32G29G25G12G24이 부분에서 제일 앞의 숫자인 8이 한 시간안의 데이터 수를 나타내는데 1200개 가량되는 데이터 중에 한 시간 안에 8개의 데이터가 있을 수도 있고 10개의 데이터가 있을 수도 있고 이런 식으로 불규칙적이여서 어찌해야할지 잘 모르겠습니다ㅜㅜ

        많으 도움 주시길 바랍니다..ㅜㅜ

    • #2830 Reply
      Sangwoo
      회원

      “8G14G22G31G32G29G25G12G24″이란 줄을 읽었을 때 이 문자값의 맨 앞의 8이란 숫자를 떼어내고, 이 값은 결국 그 아래에서 등장하는 5개의 컬럼별 값들을 각각 배열로 생성하는데 있어서 각 배열의 원소값 갯수로 사용이 되어야 하겠지요. 이러한 배열을 선언해놓고, 이 8이란 값을 반복문의 횟수로 사용을 하는 반복문이 바로 이어서 등장을 해야 합니다. 그 반복문 안에서는 8회에 걸쳐 READF문을 사용을 하고, 각 회차마다 읽은 문자값을 쪼개어서 각 배열별로 넣어둡니다. 그 이후에는 역시 8회에 걸친 반복 작업을 수행하는 반복문을 또 사용하는데, 이제는 앞서 읽어둔 배열값들을 사용하여 PRINTF문을 사용하여 다른 외부 파일에 쓰는 작업이 들어가야 합니다. 이 때에서는 앞서 읽었던 5컬럼별 데이터 배열외에도 “8G14G22G31G32G29G25G12G24″을 쪼갠 값들도 함께 사용해야 합니다.

      물론 “8G14G22G31G32G29G25G12G24″과 같은 내용에서 맨 앞의 8과 같은 값이 달라질 수 있을텐데, 이 값은 “G”를 분리자로 사용하는 STRSPLIT 함수를 사용하여 분리된 조각들 중 맨 앞의 값을 사용하면 되겠죠. 하여간 대략 이러한 방식으로 작업 흐름을 만들어보시기 바랍니다.

2 답변 글타래를 보이고 있습니다
'데이터 읽는 방법에 관한 문제'에 답변달기
글쓴이 정보: