read_csv를 이용한 파일 읽기

게시판 IDL Q&A read_csv를 이용한 파일 읽기

2 답변 글타래를 보이고 있습니다
  • 글쓴이
    • #5811 Reply
      S.H.Ahn
      회원

      안녕하세요. 데이터 읽는 과정에서 도움이 필요하여 질문글을 올립니다.

      이상우 박사님 홈페이지 “READ_CSV 함수를 이용하여 CSV 파일 읽기” 게시글을 참고하여 데이터 파일을 읽었습니다.

      아래와 같은 파일 형식이라 types 키워드를 사용하여 시간인 첫번째 열을 string으로 읽어보려 했으나 적용이 되지 않습니다.
      myfile = READ_CSV(ifile, types=[“String”,”Float” …(29개)])

      “2020-12-19 04:47:00”,0,99.83395,99.95556,99.71236,0.1216011,1.360737,1.362394,1.359079,0.001657426,4.864851,4.864851,4.864851,0,39.33303,40.26292,38.53736,0.4677739,378.0879,379.0178,377.2922,0.4677781,0.453358,0.4640759,0.444187,0.005391626,4.864851,4.864851,4.864851,0
      “2020-12-20 22:00:00”,1,99.74977,99.95556,99.71236,0.08774765,1.359589,1.362394,1.359079,0.001196003,4.861046,4.864851,4.860214,0.001779403,39.31203,39.6882,39.11255,0.2698023,378.0483,378.4204,377.8452,0.2669224,0.4531114,0.4574463,0.4508166,0.003109036,4.861046,4.864851,4.860214,0.001779403
      “2020-12-20 22:01:00”,2,99.78126,99.95556,99.71236,0.109591,1.360019,1.362394,1.359079,0.001493728,4.860617,4.861222,4.860214,0.0004938337,39.6546,40.83847,39.113,0.4785939,378.3889,379.5758,377.8452,0.4804204,0.4570595,0.4707056,0.4508166,0.0055167,4.860617,4.861222,4.860214,0.0004938337
      “2020-12-20 22:02:00”,3,99.97987,100.1988,99.71236,0.2161629,1.362726,1.365709,1.359079,0.002946306,4.8602,4.861222,4.857392,0.00169367,40.15793,40.83847,39.6881,0.2921217,378.8902,379.5758,378.407,0.2956375,0.4628605,0.4707056,0.4574463,0.003367805,4.8602,4.861222,4.857392,0.00169367

      이상우 박사님 게시글의 “ScatterplotData_mod.csv” 파일을 아래와 같이 읽어도 long, double, double로 읽힙니다.

      data = READ_CSV(file, HEADER=hdr, N_TABLE_HEADER=2, TABLE_HEADER=thdr, $
      TYPES=[‘int’, ‘float’, ‘float’])
      HELP, data, /STRUCTURES

      현재 사용하고 있는 IDL이 8.7.2버전인데 혹시 이것과 관련이 있는건가요?

      참고로 READ/READF 함수를 이용한 방식은 데이터 파일 크기 문제로 처리 시간이 오래 걸려 read_csv를 활용하려고합니다.

    • #5812 Reply
      Jonghyuk
      회원

      안녕하세요. 답변이 너무 늦었습니다. 여기에 너무 오랜만에 들어와 보기도 했고, 요 며칠간 이 사이트에 접속에 장애가 있었습니다.

      READ_CSV는 콤마로 분리만 되어 있는 파일이라면 정말 유용합니다.
      올려주신 데이터로(일부겠지만) 네줄짜리 파일을 만들어서 읽을 떄 굳이 타입을 지정할 필요도 없습니다.

      data=read_csv(file)

      이 한줄만으로도 잘 읽습니다. 첫 컬럼은 String으로, 두번째 컬럼은 Long으로, 세번째 컬럼부터는 Double로 읽습니다. 요즘 컴퓨터 사양들이 좋으니 웬만하면 메모리 두배씩 소진하더라도 골치 안아프게 16-bit integer 대신 32-bit long integer로 읽고, 32-bit float 대신 64-bit double 로 읽어버리는 전략입니다(이러한 원칙은 도움말에 잘 나와 있습니다). 더 풍요로운 데이터 타입으로 읽으면 아무래도 사고가 없거든요.

      그럼에도 타입을 지정해 주면, 타입에 맞추어 읽습니다. 제가 다음 코드도 실행해 보았습니다.

      data=read_csv(file, types=[‘string’, ‘float’, ‘float’,’float’,’float’,’float’,’float’,’float’,’float’,’float’,’float’,’float’,’float’,’float’,’float’,’float’,’float’,’float’,’float’,’float’,’float’,’float’,’float’,’float’,’float’,’float’,’float’,’float’,’float’,’float’])

      물론 위 코드에서 string 다음에는 사실상 정수이기 때문에 long이나 int로 하는 것이 더 좋겠지만, 궁금해 하시는 부분이어서 위와 같이 돌려 보았고, float로 잘 읽힙니다.

      IDL> help, data
      ** Structure <389b3010>, 30 tags, length=528, data length=528, refs=1:
      FIELD01 STRING Array[4]
      FIELD02 FLOAT Array[4]
      FIELD03 FLOAT Array[4]
      FIELD04 FLOAT Array[4]
      FIELD05 FLOAT Array[4]
      FIELD06 FLOAT Array[4]
      FIELD07 FLOAT Array[4]
      FIELD08 FLOAT Array[4]
      FIELD09 FLOAT Array[4]
      FIELD10 FLOAT Array[4]
      FIELD11 FLOAT Array[4]
      FIELD12 FLOAT Array[4]
      FIELD13 FLOAT Array[4]
      FIELD14 FLOAT Array[4]
      FIELD15 FLOAT Array[4]
      FIELD16 FLOAT Array[4]
      FIELD17 FLOAT Array[4]
      FIELD18 FLOAT Array[4]
      FIELD19 FLOAT Array[4]
      FIELD20 FLOAT Array[4]
      FIELD21 FLOAT Array[4]
      FIELD22 FLOAT Array[4]
      FIELD23 FLOAT Array[4]
      FIELD24 FLOAT Array[4]
      FIELD25 FLOAT Array[4]
      FIELD26 FLOAT Array[4]
      FIELD27 FLOAT Array[4]
      FIELD28 FLOAT Array[4]
      FIELD29 FLOAT Array[4]
      FIELD30 FLOAT Array[4]

      질문하신 내용이 아예 안읽히는 것이면 뭔가 잘못되었겠지 라고 저도 생각할텐데, 현재 문의하신 내용은 TYPES 키워드가 효력을 발휘하지 못하는 상태라서, 상황이 잘 이해가 가지 않습니다. 제가 IDL 8.7.2는 없지만, IDL 8.8, IDL 8.7.3 그리고 IDL 8.5.1 에서 실행해 보았는데 다 잘 읽힙니다. 버전 문제인 것 같지는 않습니다.

      이상우 박사님 블로그에 있는 대로 따라해 보아도 다 잘 되는 것으로 확인하였습니다.

      원인은 그래서 잘 모르겠습니다. 그런데, 현재 상태로(float가 아닌 double로 읽힘) 그냥 사용하시는 데에 문제가 있을까요?

      read_csv가 참 편리한 점은, 다음과 같이 지정해도 잘 읽는다는 것입니다.

      IDL> data=read_csv(file, types=[“string”, “int”])
      IDL> help, data
      ** Structure <31d79140>, 30 tags, length=968, data length=968, refs=1:
      FIELD01 STRING Array[4]
      FIELD02 INT Array[4]
      FIELD03 DOUBLE Array[4]
      FIELD04 DOUBLE Array[4]
      … 이하 생략….

      Double이 Float의 상위 호환이어서 그대로 쓰시는 데에 문제는 없을 것 같습니다만, 어쨌든 TYPES 키워드가 효력이 없는 상황은 좀 이상하긴 합니다.

      혹시 다음과 같은 테스트를 해 보면 어떨까요?
      IDL> data=read_csv(file, types=[“hello”])
      % READ_CSV: Unknown type string: “hello”
      % Execution halted at: $MAIN$
      어이없긴 하지만, TYPES 키워드가 파라메터를 받아들이고 있긴 한 건지 확인은 될 것 같습니다.

      • 이 답변은 Jonghyuk에 의해 1 month, 1 week 전에 수정됐습니다.
    • #5820 Reply
      Sangwoo
      회원

      질문하셨던 내용에서 시간에 해당되는 첫번째 컬럼을 string으로 읽어보려 했으나 적용이 되지 않았다고 하신 것은 결국 첫번째 컬럼이 문자형이 아닌 다른 자료형(정수나 실수?)으로 인식되었다는 말씀인가요? 그리고 첫번째를 제외한 나머지 컬럼들은 원래의 의도는 float였지만 실제로는 double로 인식되었다는 말씀인 것으로 보입니다. 저도 한번 테스트를 해보았는데 별 다른 문제없이 잘 됩니다. 제가 윈도우즈 및 Mac용 IDL 8.8, 8.7.3, 8.7.2에서 모두 테스트를 해본 바로는 그렇습니다. 따라서 제 입장도 바로 윗 댓글과 마찬가지입니다. 즉 언급하신 문제에 대한 원인이 무엇인지에 대해서는 저도 모르겠습니다.

      별 도움은 안될 것 같지만 노파심에서 말씀드려보자면, 사용중이신 IDL의 커맨드 입력창에서 다음과 같은 명령을 실행하여 read_csv.pro 코드 파일을 편집기에서 오픈해보시고,

      IDL> .edit read_csv

      이게 잘 된다면 오픈된 상태에서 read_csv를 컴파일만 한번 해준 다음에 다시 원래의 작업하시던 프로그램을 실행해보시기 바랍니다. 물론 이 방법이 근본적인 해결책은 아니긴 하지만, 현재 상황에 대한 진단 차원에서 한번 해보시는 것도 나쁘지 않을 것 같습니다.

2 답변 글타래를 보이고 있습니다
'read_csv를 이용한 파일 읽기'에 답변달기
글쓴이 정보: