C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[51964] Re:Re:Re:Re:Re:Re:Re: ole로 했을때 문제점.
장성호 [nasilso] 1567 읽음    2008-01-18 14:23
ADO를 이용하는 방법도 있는데..
제가 별로 해보지 않아서 뭐라 말씀드리기 좀 그렇구요

엑셀에서 data를 빨리 가져오고 ,  빨리 쓰고 하는 방법으로...
ClipBoard를 이용하는 방법이 종 쓰입니다.

* 원하는 Sheet를 전체 select해서
* 클립보드로 copy한후
* 글립보드에서 Text를 가죠오는 방식으로 하면
   엄청 빠릅니다.

그럼...

wjdrms 님이 쓰신 글 :
: 처음에 ole로 이용해서 데이타를 분석하고 했었습니다.
: 그런데 이게 엑셀파일에 데이타가 몇천개씩 있을경우 엑셀데이타를 열고 검색하는 속도가
: 너무 오래걸려서 다운되는 것처럼 보였습니다.
: 그래서 이 방법을 쓰려고 햇던건데..
:
: ole로 검색했을때 속도에 대한 딱히 다른 방법을 찾을 길이 없더군요.
: 여기 게시판에서도 마땅한걸 찾지 못했고..
:
: 혹시 속도를 높일수 있는 방법이 있나요.?
: 장성호 님이 쓰신 글 :
: : 음...
: :
: : 문제점 1.
: : 먼저 row의 count를 읽어오기 위해서  TStringList를 이용하셨는데..
: :  data->LoadFromFile(File_Open.c_str());
: : 위와같이 읽어와서는 라인을 읽어올수 없습니다.
: :
: :
: : 문제점2.
: :    FileOPen으로 읽었다고 하더라도 결국 전부 string으로 판단하고 AnsiString에 집어넣네요
: :    그리고  cell간에 구분이 탭( char(9)  ) 이라는 보장이 있나요?
: :
: :
: : 탭으로 구분된  *.csv파일 같은경우에는
: : 아래 방법이 가능할지 모르겠지만
: : 일반적인 엑셀파일에서는 안됩니다.
: :
: : ole를 이용하세요
: : 여기검색하면 많이 나와요
: :
: : 그럼...
: :
: :
: :
: : wjdrms 님이 쓰신 글 :
: : : 장성호님 말대로 엑셀 파일을 읽어서 그안에 데이타를 분석하는건데요.
: : : 분석할 데이타는 test.xls 파일로 되어있어요 .
: : : 파일을 읽을땐. 파일오픈을 사용해서 하고 있습니다.
: : :
: : :  int iRow, iBegin, iEnd;
: : :     int iRowIndex;
: : :     AnsiString asDateTime, asBuffer, asString;
: : :     double press, temp, state;
: : :     TStringList *slTemp;
: : :     int iFileHandle, iFileLength;
: : :     char *cBuffer;
: : :
: : :     TStringList *data=new TStringList();
: : :     Form3->ListView1->Items->BeginUpdate();
: : :
: : :     if(Form3->OpenDialog1->Execute())
: : :     {
: : :       File_Name = ExtractFileName(Form3->OpenDialog1->FileName);
: : :       File_Path = ExtractFilePath(Form3->OpenDialog1->FileName);
: : :       File_Open =   File_Path + File_Name;
: : :
: : :       data->LoadFromFile(File_Open.c_str());
: : :       iRow = 1;
: : :       asDateTime = "";
: : :       press = 0;
: : :       temp = 0;
: : :       state = 0;
: : :       iBegin = iRow;
: : :       iEnd = iBegin;
: : :       iEnd =  - 1;
: : :
: : :       iFileHandle = FileOpen(File_Open, fmOpenReadWrite);
: : :             // 파일의 끝으로 이동하여 총 길이를 구한다.
: : :       iFileLength = FileSeek(iFileHandle, 0, 2);
: : :             // 다시 처음으로 이동한다.
: : :       FileSeek(iFileHandle, 0, 0);
: : :             // 버퍼를 읽을 크기만큼 초기화한다.
: : :       cBuffer = new char[iFileLength + 1];
: : :             // 파일에서 크기만큼 데이터를 읽고 바이트수를 저장한다.
: : :       FileRead(iFileHandle, cBuffer, iFileLength);
: : :             // 파일을 닫는다.
: : :       FileClose(iFileHandle);
: : :
: : :       asBuffer = (AnsiString)cBuffer;
: : :       while(iRow <= data->Count){ //while
: : :           iEnd = iRow - 1;
: : :                if(iBegin > 0 && iEnd > 0 && iBegin < iEnd){//if3
: : :                 asString = asBuffer.SubString(iBegin, iEnd - iBegin + 1);
: : :                 // StringList에 넣은 후, comma로 구분한다.
: : :                 slTemp = new TStringList;
: : :                 slTemp->Clear();
: : :                 slTemp->Delimiter = char(9);
: : :                 slTemp->DelimitedText = asString;
: : :
: : :                 if(slTemp->Count == 4){//if4
: : :
: : :                  try{
: : :                      // StrToFloatDef();
: : :                        press = StrToFloat(slTemp->Strings[1]);
: : :                        temp  = StrToFloat(slTemp->Strings[2]);
: : :                        state = StrToFloat(slTemp->Strings[3]);
: : :                        Form3->s_press_f->Checked = true;
: : :                     }
: : :                  catch(Exception& e){//문자에 대한 예외 처리
: : :                  }
: : :
: : :                 } //if4
: : :                 delete slTemp;
: : :                 slTemp = NULL;
: : :                 iRow++;
: : :              }//if3
: : :
: : :        if(!iFileHandle){
: : :         FileClose(iFileHandle);
: : :         iFileHandle = NULL;
: : :        }     }//while
: : :     }
: : :
: : : 이런식으로 되어있습니다. 따로 엑셀컴포넌트를 쓰지않고 오픈다이얼로그랑 파일오픈을 사용해서
: : : 하고 있는거죠.
: : :
: : :
: : :        iRow++;
: : : 장성호 님이 쓰신 글 :
: : : : excel파일이라고 했죠?
: : : :
: : : : data->Count 는 excel의 row 숫자같구
: : : : asBuffer       에는 전체 string이 들어있는것처럼 코딩되어잇는데...
: : : :
: : : : 처음에 excel에서 data를 가져올때 어떻게 가져오죠?
: : : : 거기에 문제가 있을것 같습니다.
: : : :
: : : : 통합문서형식의 *.xls파일이면 ole를 통해서 읽어와야 정확할것이구요
: : : : 그냥   콤마(,)로 구분된것이라면 TStringList로 읽어와도 되겠구요
: : : :
: : : : 그럼..
: : : :
: : : :
: : : : wjdrms 님이 쓰신 글 :
: : : : : 답변 고맙습니다.
: : : : : 그런데 기본적으로 분석할 모든 데이타에는 문자열이 들어있습니다.
: : : : : 문자열이 있다고해서 에러는 아니구요.
: : : : :
: : : : : 그 문자열을 빼고 나머지 데이타만  검색을 하려고 하는데
: : : : :
: : : : : 검사할때 시작을 숫자가 있는 시점부터 검사를 햇는데 그래도 문제가 발생하네요..^^;;
: : : : : 
: : : : : 그 문자열을 제외하고
: : : : : 장성호 님이 쓰신 글 :
: : : : : : StrToFloat , StrToInt 같은 String 변환함수에는
: : : : : :
: : : : : : SysUtils에 3가지 형태가 만들어져 있습니다.
: : : : : :
: : : : : : 타입1 . StringToFloat  
: : : : : : 타입2. StringToFloatDef
: : : : : : 타입3. TryStrinToFloat
: : : : : :
: : : : : : 세가지는 모두 에러처리를 어떻게 하냐에 따라 나누어졌다고 볼수 있는데....
: : : : : :
: : : : : : 타입1은  에러가 발생했을때 Exception이 발생합니다.
: : : : : :
: : : : : : 타입2는  에러발생했을때 Default값으로 넘겨준 값을 반환해 줍니다.
: : : : : :    샘플    float f;
: : : : : :
: : : : : :             f = StringToFloatDef ( "asfdadsf", 0 );
: : : : : :             ; 이경우 "asfdadsf" 은 float형으로 변환할수 없기때문에 Default값으로 준 0 값을 반환해주는것입니다.
: : : : : :
: : : : : : 타입3 는  기본적으로 return 값이 bool형입니다.
: : : : : :           성공적으로 변환하면 true를 ,  실패하면 false를 반환하죠
: : : : : :           성공적으로 변환했을때 값은 call by refrence 로 넘겨주죠
: : : : : :  
: : : : : :       샘플
: : : : : :                  float f ;
: : : : : :                 if( ! TryToFloat( "asdfafd" , f ))
: : : : : :                 {
: : : : : :                      ShowMessage("값이 잘못되었네요...")   ;
: : : : : :                 }
: : : : : :               
: : : : : :
: : : : : : 그럼....
: : : : : :
: : : : : :
: : : : : : wjdrms 님이 쓰신 글 :
: : : : : : : 엑셀파일을 열어서 저장된 데이타를 분석해서 깨진데이타가 조건에 맞지 않는 값이 있는지
: : : : : : :
: : : : : : : 확인하려고 하는데 엑셀 데이타 안에 숫자만 있으면 잘 동작합니다.
: : : : : : :
: : : : : : : 그런데 기본적으로 엑셀파일에 파일에 대한 정보가 저장이 되어있고 그다음에 숫자가 입력되어있기때문에
: : : : : : :
: : : : : : : 에러가 나네요..
: : : : : : :
: : : : : : : test.xls
: : : : : : :
: : : : : : : 파일이름 : 행복
: : : : : : : 파일 버전 : 행복한 버전
: : : : : : : 날짜 : 2008년 1월 18일
: : : : : : :
: : : : : : : 시간               데이타1            데이타2
: : : : : : : 14:11:00           1                        2
: : : : : : : 14:11:00           1                        2
: : : : : : : 14:11:00           1                        2
: : : : : : : 14:11:00           1                        2
: : : : : : : 14:11:00           1                        2
: : : : : : :
: : : : : : :
: : : : : : : 이런식으로 저장이 되어잇습니다.
: : : : : : :
: : : : : : :  while(iRow <= data->Count){ //while
: : : : : : :           iEnd = iRow - 1;
: : : : : : :                if(iBegin > 0 && iEnd > 0 && iBegin < iEnd){//if3
: : : : : : :                 asString = asBuffer.SubString(iBegin, iEnd - iBegin + 1);
: : : : : : :                 // StringList에 넣은 후, comma로 구분한다.
: : : : : : :                 slTemp = new TStringList;
: : : : : : :                 slTemp->Clear();
: : : : : : :                 slTemp->Delimiter = char(9);
: : : : : : :                 slTemp->DelimitedText = asString;
: : : : : : :
: : : : : : :                 if(slTemp->Count == 4){//if4
: : : : : : :
: : : : : : :                  try{
: : : : : : :                  
: : : : : : :                        data1= StrToFloat(slTemp->Strings[1]);
: : : : : : :                        data2= StrToFloat(slTemp->Strings[2]);
: : : : : : :                   }
: : : : : : :                  catch(Exception& e){//문자에 대한 예외 처리
: : : : : : :                  }
: : : : : : :
: : : : : : :                 }
: : : : : : :                 delete slTemp;
: : : : : : :                 slTemp = NULL;
: : : : : : :                 iRow++;
: : : : : : :              }
: : : : : : :       }
: : : : : : :        iRow++;
: : : : : : :
: : : : : : :
: : : : : : : 이런식으로 처리했는데 검색해보니까 문자에 대한 예외처리를 해야한다고도 하고
: : : : : : :    // StrToFloatDef(); 이걸 사용하면 된다고도 하는데 정확한 방법을 모르겠네요.
: : : : : : :
: : : : : : : 답변 부탁드릴게요

+ -

관련 글 리스트
51940 문자열이 있는 파일에서는 비교가 안되요.. wjdrms 1114 2008/01/18
51943     Re:문자열이 있는 파일에서는 비교가 안되요.. 장성호 1242 2008/01/18
51950         Re:Re:문자열이 있는 파일에서는 비교가 안되요..-그런데. wjdrms 1262 2008/01/18
51955             Re:Re:Re:문자열이 있는 파일에서는 비교가 안되요..-그런데. 장성호 1354 2008/01/18
51961                 Re:Re:Re:Re: 파일명 wjdrms 1144 2008/01/18
51962                     Re:Re:Re:Re:Re: 파일명 장성호 1286 2008/01/18
51963                         Re:Re:Re:Re:Re:Re: ole로 했을때 문제점. wjdrms 1136 2008/01/18
51964                             Re:Re:Re:Re:Re:Re:Re: ole로 했을때 문제점. 장성호 1567 2008/01/18
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.