|
장성호님 말대로 엑셀 파일을 읽어서 그안에 데이타를 분석하는건데요.
분석할 데이타는 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(); 이걸 사용하면 된다고도 하는데 정확한 방법을 모르겠네요.
: : : :
: : : : 답변 부탁드릴게요
|