PRISM
프로그램을 작성하면서 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로 데이터를 구분하니
그에 맞추어 간단하게 수정을 해보았다.
문제가 발생하던 파일에선 정상적으로 잘 출력이 되었으나, 자릿수를 더 넘어서 양수임에도 불구하고(음수 부호가 없다) 공백이 없다면... 내 지식으론 처리하기 어렵지 싶은데...
여튼 이런 트릭으로 이 문제를 해결!
트랙백 주소 : http://blog.sam-chon.com/blog/trackback/6
댓글을 달아 주세요