Posted on 2011/09/26 20:04 / Filed Under Coding/C#
글 주소 : http://blog.sam-chon.com/blog/6

PRISM1) 프로그램을 작성하면서 1라인 1데이터가 아닌 1라인 N데이터를 읽어야 하는 경우가 생겼다.

CASE 1
  -.004018  -.004017  -.004029  -.004020  -.004020  -.003994  -.003970  -.003916
  -.003870  -.003802  -.003751  -.003690  -.003655  -.003622  -.003610  -.003590
  -.003566  -.003502  -.003466  -.003404  -.003328  -.003189  -.002960  -.002640
  -.002309  -.001918  -.001669  -.001557  -.001560  -.001566  -.001613  -.001782


위와 같은 경우인데 이 파일은 작성시에 %8f10.6 형식으로 출력된듯 보였다.
위의 경우에선 별 문제가 없지만 파일을 읽다보니.

CASE 2
 -9.253443 -9.762612-10.204670-10.591550-10.932500-11.231600-11.495950-11.727500
-11.910750-12.054820-12.180330-12.287930-12.367450-12.436120-12.501740-12.531370
-12.538000-12.528090-12.501160-12.457860-12.382530-12.262680-12.075410-11.795140
-11.435660-10.992180-10.506850-10.036080 -9.630808 -9.319317 -9.120338 -8.921580
 -8.826056 -8.779691 -8.634315 -8.461272 -8.219485 -7.850664 -7.415677 -6.993391


위와 같은[각 데이터간 공백이 하나도 없는] 구간이 있었다. 출력 Format의 자릿수를 넘어가서 발생한 경우인 것 같은데..

일반적으로

StreamReader sr = new StreamReader(filepath);
string line = sr.ReadLine();
string[] tmp_line = null;
double[] data_array = new double[NumOfDataPerLine];
char[] set_delimiter = {' ','/','\t'};
tmp_line = line.Split(set_delimiter);
for(int i =0;i < tmp_line.Length;++i)
{
data_array[i] = double.Parse(tmp_line[i]);
}
sr.close();


위와 같은 코드로 작성되었을때 CASE 1의 데이터는 잘 처리하지만
CASE 2의 데이터는 처리가 되지 않는다. [당연히.]

그래서 코드를 다음과 같이 수정하니 정상적으로 작동 되었다.
큰 수정은 아니고 아주 작은 트릭이랄까..

사실상 음수가 아닌 경우엔 처리가 되지 않을듯 싶다.

StreamReader sr = new StreamReader(filepath);
string line = sr.ReadLine();
string[] tmp_line = null;
double[] data_array = new double[NumOfDataPerLine];
line = line.Replace("-"," -"); //추가
char[] set_delimiter = {' ','/','\t'};
tmp_line = line.Split(set_delimiter);
for(int i =0;i < tmp_line.Length;++i)
{
data_array[i] = double.Parse(tmp_line[i]);
}
sr.close();


음수 부호(-)를 만나면 강제로 음수 부호 앞에 공백을 하나 넣는 것이다.

어차피 기존 코드 처리방식이 delimiter를 정하고 해당 delimiter로 데이터를 구분하니
그에 맞추어 간단하게 수정을 해보았다.

문제가 발생하던 파일에선 정상적으로 잘 출력이 되었으나, 자릿수를 더 넘어서 양수임에도 불구하고(음수 부호가 없다) 공백이 없다면... 내 지식으론 처리하기 어렵지 싶은데...

여튼 이런 트릭으로 이 문제를 해결!
Footnote.
  1. 1)http://sem.inha.ac.kr/program/prism/index.htm [Back]

2011/09/26 20:04 2011/09/26 20:04
TAG : , ,

About

by 삼촌

Notice

Creative Commons License

이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.