Q&A

  • binary파일을 text 파일로 변환하는 문제인데요. 도움이 필요해요.
binary로 검색하니 FileStream.Read(buff,Length(buff)); 을 사용하라기에
해보려고 했는데 제가 취급하려는파일이 다른 프로그램에서 생긴 파일이라 구조를
몰라서 buff size를 얼마로 해야할지 어떤식으로 끊어읽어야 할 지 막막합니다.
원본파일은 확장자가 *.DAQ이고 프로그램에서 일부분씩 텍스트로 저장하는기능이
있어서 그걸로 저장해서 보니 다음과 같습니다.

Copyright 2003,MapsiSoft Inc.
DaqFile        T20070330-172532.daq
Time        2007-03-30 17:25:32
Rate        100
Channels        6

Time        풍속        풍향        W        X        Y        Z
0.00000000000000E+0000         7.31809437274933E-0002         3.34449243545532E+0000         2.49369502067566E+0000        -2.89358079433441E-0001        -1.48968994617462E-0001        -2.28768512606621E-0002
1.00000000000000E-0002         7.25277513265610E-0002         3.34579420089722E+0000         2.49397444725037E+0000        -2.90094763040543E-0001        -1.48642972111702E-0001        -2.26718969643116E-0002
2.00000000000000E-0002         7.22541958093643E-0002         3.35097289085388E+0000         2.49403643608093E+0000        -2.89789587259293E-0001        -1.48616150021553E-0001        -2.23638694733381E-0002
3.00000000000000E-0002         7.22535997629166E-0002         3.34230685234070E+0000         2.49400019645691E+0000        -2.89925485849380E-0001        -1.48387864232063E-0001        -2.22500730305910E-0002
4.00000000000000E-0002         7.22232013940811E-0002         3.35190916061401E+0000         2.49401688575745E+0000        -2.89591699838638E-0001        -1.47991508245468E-0001        -2.23400387912989E-0002
5.00000000000000E-0002         7.21653923392296E-0002         3.34504318237305E+0000         2.49403166770935E+0000        -2.89768725633621E-0001        -1.47639259696007E-0001        -2.19730269163847E-0002
6.00000000000000E-0002         7.17601254582405E-0002         3.34587097167969E+0000         2.49405980110168E+0000        -2.90063768625259E-0001        -1.47195816040039E-0001        -2.22619883716106E-0002
7.00000000000000E-0002         7.15670287609100E-0002         3.35098481178284E+0000         2.49404311180115E+0000        -2.90132910013199E-0001        -1.47033095359802E-0001        -2.25616749376059E-0002
8.00000000000000E-0002         7.15598762035370E-0002         3.34253501892090E+0000         2.49401450157166E+0000        -2.89427816867828E-0001        -1.47446140646935E-0001        -2.21327003091574E-0002
9.00000000000000E-0002         7.15503394603729E-0002         3.35165476799011E+0000         2.49402403831482E+0000        -2.89594680070877E-0001        -1.47927731275558E-0001        -2.20921859145164E-0002
1.00000000000000E-0001         7.14931264519691E-0002         3.34447813034058E+0000         2.49407887458801E+0000        -2.89926081895828E-0001        -1.48175686597824E-0001        -2.20594163984060E-0002

근데 원본을 한 문자씩 읽어봐도 어떤식으로 끊어야 이런 텍스트 파일을 얻을 수 있는지  통 모르겟습니다.
질문이 좀 애메하죠?  감을 못 잡아서...
아뭏튼 아시는 분 도움 좀 주세요.
새로운 일 할 때마다 모르는거 투성이네요.
3  COMMENTS
  • Profile
    김기홍 2007.12.26 06:03
    일반적인 정형파일은 아닐거구 파일 확장자는 별다른 의미가 없을수도 있구요.
    스트림저장되었을거니까 정확한 구조파악에 약간 시간이 걸리겠네요.

    참고 자료는 6개 채널로 rate 100(?) 으로 획득된 자료 같습니다.
    버퍼사이즈는 구조와는 관계없구 레코드 사이즈가 자료 획득 기준이겠죠.

    데이타 파일 구조가 보통 헤드부(head_length)와 실제 자료가 저장되는 몸통부가 있을 겁니다.
    하나의 데이타 파일로는 구조 파악이 힘들고 두개이상이 있어야 저장조건을 찾을 수 있습니다.
    같은 6개의 체널과 rate 100으로 획득되었으나 전체 자료갯수가 틀린 다른 파일이 있으면
    간단한 이차방정식으로 헤드부의 크기와 몸통부의 레코드 길이를 파악할 수 있읍니다.

    이런식으로 바이너리파일의 구조를 파악하였어도 다 성공하는 것은 아닙니다.
    데이타 파일을 만들어낸 프로그램이 특이한 구조의 데이타 형식을 사용했다면 컨버팅이 힘들어지죠.
    컴파일러 따라서 실수 저장형식이 틀려질 수 있기 때문입니다.

    간단히 예를 들어보겠습니다.
    1번파일 : 파일크기 11K 레코드 20개
    2번파일 : 파일크기 12K 레코드 22개
    라면

    이 형식의 데이타 파일에는 파일헤드는 1K, 레코드 2개당 1K라는 구조가 파악되겠죠.
    그러면 파일 컨버팅에서는 처음 1K 는 넘어가시고 그 다음부터 읽어들여서 변환시키면 됩니다.

    레코드당 길이가 512바이트로 예상되니까 데이타 형식을 고려하여 적절히 레코드의 필드를 예측합니다.
    일반적으로 정수형식은 2, 4바이트, 불린형식은 1바이트, 바이트는 물론 1바이트,
    실수형식은 4,6,8,... 등입니다. 문자형은 대충 2의 배수로 하지만...
    레코드 구분자가 혹시 있다면 바이너리 뷰어로 레코드 길이를 확인할 수도 있습니다.

    실수형식은 저장방식이 컴파일러에 따라서 틀릴 수 있습니다. 실수저장방식은 기저가 사용되어서
    실제로 기저를 16으로 하는지 아니면 다른 수를 사용한 것인지 또 지수부와 수치부(?)의 비트수를
    어떻게 할당하였는지에 따라서 서로 틀려서... 이게 복잡은 하죠.
    즉 쉽게 말하면 컨버팅 안될수도 있다는 겁니다.
    근데 일반적인 컴파일로로 일반적으로 사용되는 실수형 구조를 사용하였다면 컨버팅되겠죠.

    자료 컨버팅에 고생이 많으신데 성공하십시요.
    자료구조 찾아내는 것도 필요한 작업이죠...


  • Profile
    임정미 2007.12.26 22:26
    관심 가져주셔서 감사합니다.
    말씀하신대로 이것저것 해봐야할것 같군요  도움이 됐습니다.^^


  • Profile
    최용일 2007.12.21 19:43
    데이터가 실수인듯하니까 읽으실때 문자단위가 아니라 실수단위로 읽어보세요...

    델파이에서 실수형은 Double, Single, Real, ...등이 있습니다.

    아무런 구조를 모른 상태에서 데이터 파일을 분석하는것은 어쩔수 없이 많은 시행착오가 따르기 마련입니다.

    • minsic
      2008.01.04 06:12
      응용프로그램으로 구현하신다면 activex 만들어서 하시면 되고 순순 웹으로 구현하신면 엑셀을 html이...
    • 봉봉
    • 2007.12.27 02:14
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 소울해커
      2008.01.11 00:29
      델파이 강의실에서 나노시스의 그래픽 강좌 라는 제목으로 자세하게 나와있습니다.
    • 김범진
    • 2007.12.27 00:42
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 김춘경
      2007.12.28 07:48
      FormCreate 프로시저에서 발생하는 AccessViolation 에러는 주로 해당 기능을 가진 폼이 아직 생성되지 않...
    • bluehill
      2008.01.08 02:31
      한가지 꽁수를 알려드립니다. 메뉴를 hidden으로 만들고 short key프로퍼티에 ESC를 넣어보세요.
    • 3K
    • 2007.12.26 23:32
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 김무승
    • 2007.12.26 21:59
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 송 시중
      2007.12.26 19:43
      그냥 공용 pas하나 만들고 connection을 둬서, 각 폼에선 그 connection을 사용하게 하면 되지요.
    • Terry KIM
      2007.12.26 20:54
      감사합니다. 메인폼을 하나 만들고, 거기에 ADOConnection을 두고 실행하니 한번만 비밀번호를 묻는군요....
    • Marek
      2008.01.04 09:37
      안녕하세요 설명하신 내용으로는 이해가 잘 안갑니다. 통상 그런 결과가 나오진 않거든요. 상황을 좀 ...
    • 하덕진
    • 2007.12.26 10:54
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이정욱
      2008.01.12 08:23
      아래를 참고하세요 ~ <!--CodeS--> Procedure SaveStringsAsUnicode( const thefilename:String;...
    • jeijei
    • 2007.12.26 10:08
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 김춘경
      2008.01.07 16:05
      저도 몇 년 전에 오라클을 사용하면서 레코드 카운트가 예상값과 달라서 고민하다가 이 명령을 사용한 기억...
    • jeijei
      2008.01.12 03:29
    • jeijei
      2007.12.26 05:25
      select문을 썼는데 데이터가 삭제된다면 안돼죠.. 데이터저장이 확실히
    • 신명곤
      2007.12.27 07:19
      먼저 jeijei님께 감사드립니다. 드디어 해결했습니다. 항상 query를 열고 닫을때 사용하는 close와 sql...
    • bluehill
      2008.01.08 01:12
      graphic32의 layer기능을 리용하면 크기조절과 이동만이 아니라 회전과 zorder조종도 가능합니다. 프리웨...
    • 김길현
    • 2007.12.25 15:21
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 김길현
      2008.01.01 01:09
      XML 해더를 추가 하려면요. ISoapHeaders 클래스를 이용해서 사용하시면 됩니다. H라는 클래스( I...
    • 허학송
    • 2007.12.21 20:12
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2007.12.21 21:38
      델파이 IDE에서 실행시 기본적으로 예외를 처리하더라도 예외가 보이도록 설정이 되어 있습니다. 탐색기에...
    • jeijei
      2007.12.22 09:00
      답변 감사합니다. 그런데 탐색기에서 실행하란 말씀은 무슨뜻인지요? 컴파일된 EXE화일을 실행하면 된...
    • 최용일
      2007.12.24 18:05
      네... exe파일을 실행하시면 됩니다. 델파이에서 F9눌러서 실행하시면 기본적으로 예외처리를 하셔도 예...
    • jeijei
      2007.12.25 08:02
      답변 감사드립니다..
    • 델초보
    • 2007.12.21 09:48
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 정형준
      2007.12.23 01:09
      다른 분들의 설명 모두 맞습니다. 전체적으로 보면 보통 이렇게 합니다. <!--CodeS-->  &n...
    • 최용일
      2007.12.21 19:46
      Close가 조회한 결과(데이터셋)을 닫는 명령입니다. Open다음에 Close를 쓰시니까 당연히 조회가 안되죠......
    • 정경철
      2007.12.22 03:56
      참고!!! 2번 버튼을 눌렀으니.. 똑같은 쿼리 문이 2번 들어 갔겠죠.. 쿼리문 넣기전에  sql....
    • 델초보
    • 2007.12.21 08:29
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 구창민
      2007.12.22 02:00
      안녕하세요... 아래코드를 참고하세요.. procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; co...
    • 이종탁
      2007.12.21 09:29
      가로면 Row 값을 말씀하시는 건가요? dbgrid 에 연결된 DataSet 을 읽으면 됩니다. 예를 들어 ...
    • 임정미
    • 2007.12.21 02:01
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 김기홍
      2007.12.26 06:03
      일반적인 정형파일은 아닐거구 파일 확장자는 별다른 의미가 없을수도 있구요. 스트림저장되었을거니까 정...
    • 임정미
      2007.12.26 22:26
      관심 가져주셔서 감사합니다. 말씀하신대로 이것저것 해봐야할것 같군요  도움이 됐습니다.^^ ...
    • 최용일
      2007.12.21 19:43
      데이터가 실수인듯하니까 읽으실때 문자단위가 아니라 실수단위로 읽어보세요... 델파이에서 실수형은 D...
    • 김범진
    • 2007.12.20 20:55
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 김기홍
      2007.12.26 06:32
      알고 계시겠지만 소팅은 제일 어려운 문제중에 하나입니다. 질문하신 것을 정리하면   1. 현...
    • 최용일
      2007.12.21 00:57
      배열에서 뜬금없이 컬럼이야기가 나와서 한참을 생각했네요... 쉽게 생각하세요... 여러 컬럼(?)들을 하...
    • 스터디
    • 2007.12.20 18:13
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이종탁
      2007.12.21 09:36
      DBGrid에 바로 나타낼 수 있는 방법은 없어 보이네요. 굳이 DBGrid를 써야 한다면 저라면 일단 값을...