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
[51746] Re:고맙습니다 - 질문하나 더할게요.
네버 [] 1743 읽음    2007-12-27 19:42
알려주신데로 하는데
while(!feof(sfp)) {
:           if(fgets(buffer, sizeof(buffer), sfp) == NULL) break;
여기에서 buffer를 설정할때 AnsiString 로하는건가요?

근데 AnsiString 로 설정하고 할 경우
a = buffer.pos(char(9)); // 9번 ASCII코드가 TAB문자에요.
:     RecodeTime = buffer.SubString(1, a); // 처음부터 탭문자까지 날짜로 읽음
:     buffer = buffer.SubString(a, buffer.Length() - a); // 읽은 글자는 지웁니다.
:
:     b = buffer.pos(char(9));
:     Data01 = FormatFloat("0,00", buffer.SubString(a, b)); // 첫번째 탭문자부터 다음 탭문자까지 데이터 읽음
:     buffer = buffer.SubString(b, buffer.Length() - b); // 읽은 글자는 지웁니다.
:
:     c = buffer.pos(char(9));
:     Data02 = FormatFloat("0,00", buffer.SubString(b, c));
[C++ Error] uComm.cpp(1642): E2342 Type mismatch in parameter 'index' (wanted 'int', got 'AnsiString')
이러한 에러들이 발생합니다.

[C++ Error] uComm.cpp(1636): E2034 Cannot convert 'AnsiString' to 'char *'
이런 메세지도요.

그래서  TStringList *data=new TStringList();
data->LoadFromFile(File_Open.c_str());

이런식으로 사용하게 되면 data->string.pos는 가능하나
  Data01 = FormatFloat("0,00", buffer.SubString(a, b)); // 첫번째 탭문자부터 다음 탭문자까지 데이터 읽음
이것처럼 첫번째 탭에서 다음 탭사이의 데이타를 읽어 주는게 나타나질 않습니다.

답변 다시 한번 부탁드릴게요

조대현.Clau 님이 쓰신 글 :
: 1. 일단 올려주신 답변의 파일 형식은 탭구분 파일 같습니다. 이런 파일은 엑셀에서 읽으면 엑셀이 자동으로 나눠서 보여주기에 편하게 읽혀지지만 엑셀파일형식은 아닙니다.
: ★만약 엑셀파일이라면 OLE를 통하지 않고 ADO로 DB형식으로도 읽을 수 있습니다.
:
: 2. 이런 파일은 탭으로 구분하면 정확한데
:    1) 실제 탭문자를 파싱하시던지
:    2) TStringList에 넣어서 Delimiter로 구분하시던지 하심 됩니다.
:   
:
: 3. 일단 데이터를 한줄 읽고
:
:     while(!feof(sfp)) {
:           if(fgets(buffer, sizeof(buffer), sfp) == NULL) break;
:
:     여기서 buffer에 데이터 한줄 통째로 들어가겠죠?
:
: 4. 탭문자로 구분하여 변수(or배열)에 넣습니다.
:
:     AnsiString에 넣어서 Pos메소드로 찾으셔도 되고요. char 하나씩 Tab문자인지 확인하셔서 각 데이터를 분류합니다.
:     a = buffer.pos(char(9)); // 9번 ASCII코드가 TAB문자에요.
:     RecodeTime = buffer.SubString(1, a); // 처음부터 탭문자까지 날짜로 읽음
:     buffer = buffer.SubString(a, buffer.Length() - a); // 읽은 글자는 지웁니다.
:
:     b = buffer.pos(char(9));
:     Data01 = FormatFloat("0,00", buffer.SubString(a, b)); // 첫번째 탭문자부터 다음 탭문자까지 데이터 읽음
:     buffer = buffer.SubString(b, buffer.Length() - b); // 읽은 글자는 지웁니다.
:
:     c = buffer.pos(char(9));
:     Data02 = FormatFloat("0,00", buffer.SubString(b, c)); // 두번째 탭문자부터 다음 탭문자까지 데이터 읽음
:
:     원리만 이해하시고 좀더 논리적인 코드로 만드시면 됩니다.
:
:     구조체 배열 쓰시면 더 편하겠네요.
:
:     struct DataRecord{
:         TDateTime dtRecordTime;
:         double dData01;
:         double dData02;
:         double dData03;
:     }
:
:     DataRecord drData(100);
:
:
: 5. 각 데이터를 비교합니다.
:     if drData(1).dData > 500 then ErrorFunction(); // 에러처리
:
: 6. 대신 한번이라도 탭이 어긋나면 밀려날 수 있으므로 각 행의 첫번째에 날짜데이터가 들어왔는지등 검사항목도 있어야 겠죠.
:
:
: ※ 약식 코드이므로 Copy&Paste로 절!대! 작동 안되는 코드입니다ㅋㅋ
:
:
:
:
:
:
:
:
:
: 네버 님이 쓰신 글 :
: : 답변 고맙습니다.
: :
: : 이래저래 하다가 결국 엑셀파일을 텍스트 파일로 여는 방법을 선택했어요
: : fopen사용해서.
: :
: : 그런데 텍스트 파일로 열었는데. 텍스트 파일안에 있는 데이타 진단은 어떻게 해야할지 감이 안잡히네요.
: : char buffer[250];
: : File_Name = ExtractFileName(Form3->OpenDialog1->FileName);
: : File_Path = ExtractFilePath(Form3->OpenDialog1->FileName);
: :
: :  File_Open =   File_Path + File_Name;
: :
: :   if((sfp = fopen(File_Open.c_str(),"r")) == NULL) return;
: :
: :    while(!feof(sfp)) {
: :          if(fgets(buffer, sizeof(buffer), sfp) == NULL) break;
: :       여기서
: :       저장된 데이타값들중 깨진문자는 없는지.
: :        if(data1 , data2 깨진문자가 있나요?)
: :        if(data1 > 500 || data2 >800)
: :       {
: :              에러.
: :       }      
: : 저장된 값이 max값을 초과하는지 비교하고 싶습니다.
: : 이럴경우 어떻게 텍스트 파일안에 데이타를 건드려야 할지 모르겠네요.
: :
: :
: : }
: :
: :
: : 이렇게 파일을 열었는데.
: : 현재 텍스트 파일에는  밑에처럼 저장이 되어있습니다.
: :
: : ==========================
: : 버젼 : ver 1.1.0                   
: : Date     : 07/10/22           
: : hh:mm:ss    data1    data2    data3
: : 6:31:53    204    25    2
: : 6:31:55    213    29    2
: : 6:31:57    207    32    2
: : 6:31:59    gdg    32    2
: : 6:32:01    213    12    2
: : 6:32:03    200    43    2
: : 6:32:05    196    43    2
: : 6:32:07    188    45    2
: : 6:32:09    111    44    2
: : 6:32:11    182    46    2
: : 6:32:13    199    dd    2
: : 6:32:15    191    48    2
: : 6:32:17    177    46    2
: : 6:32:19    199    50    2
: :
: : ==========================
: : 이때 버퍼에 들어가는 데이타를 확인해보면 버퍼에 버전 날짜 시간 데이타값이 한꺼번에 다 들어가있거든요.
: :
: : 다시한번 답변 부탁드립니다.
: :
: : 장성호 님이 쓰신 글 :
: : : 일단 데이타가 시간이 많이 걸리는것은 어쩔수 없을것입니다.
: : : 그런데 그동안 화면에 버벅거리지 않으려면...
: : :
: : : 방법1. for문안에 Application->ProcessMessages()를 넣으세요
: : :
: : :         bFindStop=false;
: : :          for(int j=5;j<row;j++){
: : :            Form1->edit1->Text  = sh.OlePropertyGet("Cells",j,3).OlePropertyGet("Value");
: : :            Form1->graph->DigitCh1 = sh.OlePropertyGet("Cells",j,3).OlePropertyGet("Value");
: : :
: : :           Application->ProcessMessages(); //이부분에서 다른 윈도우 메세지및 화면처리를 합니다.
: : :
: : :           if(bFindStop)break;// 검색을 중지하려면 for문을 빠져나옴
: : :
: : :       }
: : :         
: : : 방법2. excel을 open하여 data를 검색하는 부분을 쓰레드로만드세요
: : :           검색 결과만을 메인 쓰레드로 주면 되니까...
: : :
: : : 방법3. excel에도 검색기능이 있습니다.
: : :          저도 해보진 않았지만 ole를 이용해서 excel에 자체 검색 기능을 이용하는것이 더욱좋을것 같습니다.
: : :
: : :          excel(office2003)로 메크로를 저장해 보니까 아래와 같은것이 ...
: : :          "BorderStyle"은 제가 검색한 text입니다.
: : :
: : :     Cells.Find(What:="BorderStyle", After:=ActiveCell, LookIn:=xlFormulas, _
: : :         LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
: : :         MatchCase:=False, MatchByte:=False, SearchFormat:=False).Activate
: : :     Cells.FindNext(After:=ActiveCell).Activate                       //다음검색
: : :     Cells.FindNext(After:=ActiveCell).Activate                       //다음검색
: : :
: : : 방법4. 엑셀에서 각 Cell을 하나하나씩 읽어오는것은 속도가 느립니다.
: : :           좀더 빠르게 하는 대안으로  ClipBoard를 많이들 이용하지요
: : :           - 엑셀에 내용을 ClipBoard로 copy하고
: : :           - ClipBoard의 내요을 다시 가져와서 그런다음.. 검색한다면.. 빠를듯...
: : :
: : :
: : : 방법3을 잘만들어서 방법2와 조합한다면....더욱 좋을듯...
: : :
: : :
: : : 그럼..
: : :
: : :
: : :       
: : :
: : : 네버 님이 쓰신 글 :
: : : : 컴퓨터에 있는 엑셀파일을 열어서 검사하는 부분을 하는데.
: : : : 엑셀에 row데이타가 17000개 정도 됩니다.
: : : : 데이타 양이 많아지니까 검사하는데 속도도 오래 걸리고 17000개 정도되면
: : : : 아예 프로그램이 다운이 되버리더라구요.
: : : : 
: : : :        Form1->ListView1->Items->BeginUpdate();
: : : :        ex.OlePropertyGet("WorkBooks").OleProcedure("Open",File_Open.c_str());
: : : :
: : : :         Variant awb=ex.OlePropertyGet("ActiveWorkBook");
: : : :         Variant sh=awb.OlePropertyGet("ActiveSheet");//엑티브sheet
: : : :
: : : :         int row=sh.OlePropertyGet("UsedRange").OlePropertyGet("Rows").OlePropertyGet("Count"); //row갯수
: : : :
: : : :         for(int j=5;j<row;j++){
: : : :           Form1->edit1->Text  = sh.OlePropertyGet("Cells",j,3).OlePropertyGet("Value");
: : : :           Form1->graph->DigitCh1 = sh.OlePropertyGet("Cells",j,3).OlePropertyGet("Value");
: : : :     
: : : :      }
: : : :    Form1->ListView1->Items->EndUpdate();
: : : :    awb.OleProcedure("Close");
: : : :    ex.OleProcedure("Quit");
: : : :
: : : :    awb=Unassigned;
: : : :    ex=Unassigned;
: : : :
: : : : 이렇게 하는데 row값이 17000값이 되면 이게 다운이 되고 그래프에 표기도 안되더라구요.
: : : : 또한 실행파일을 꺼도 엑셀파일이 계속 살아있구요~
: : : :
: : : : 찾아봐도 해결방법을 찾지 못해서 질문드립니다.
: : : :
: : : : 해결방법을 찾을수 있는 검색어나 힌트만 주셔도 괜찮습니다. 답변 부탁드려요

+ -

관련 글 리스트
51737 엑셀 파일 데이타 점검시 속도 문제. 네버 1545 2007/12/27
51738     Re:엑셀 파일 데이타 점검시 속도 문제. 장성호 2070 2007/12/27
51742         Re:Re:엑셀 파일 데이타 점검시 속도 문제.- 답변 고맙습니다 - 질문하나만 더할게요 네버 2466 2007/12/27
51743             파일이 탭구분 파일인것 같네요. 탭문자로 파싱해서 사용하세요. 조대현.Clau 3123 2007/12/27
51746                 Re:고맙습니다 - 질문하나 더할게요. 네버 1743 2007/12/27
51748                     Tab 구분파일 읽는 예제입니다. 조대현.Clau 3304 2007/12/28
51759                         Re:고맙습니다^^ 근데 에러가.. 네버 1378 2007/12/28
51766                             흠~ 빌드해서 작동하는거 보고 올린소스인데~ㅎ 조대현.Clau 1084 2007/12/29
51774                                 Re:흠~ 빌드해서 작동하는거 보고 올린소스인데~ㅎ 네버 1179 2008/01/02
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.