CSV란 콤마(,)로 구분한 일련의 데이터들을 말한다.
예를 들면 아래와 같다.
고양이,강아지,곰,상어,토끼
100,20,55,177,83
이런 형식은 서로 호환 되지 않는 프로그램끼리 데이터들을 주고 받을때 유용하게 쓰인다.
또한 매우 간단하기 때문에 부담도 없다.
하지만 흔한 문제점 하나가 있다.
콤마가 있는 데이터가 있을 경우다.
56
10,000
1,500
300
890
2,360,050
74
금액을 표시할때 위와 같이 종종 단위 콤마를 쓰는데
이것을 CSV로 표현하면,
56,10,000,1,500,300,890,2,360,050,74
가 된다. 의도와는 다르게 데이터가
56
10
100
1
500
300
890
2
360
050
74
로 나누어져 버렸다
그래서 콤마가 있는 데이터를 큰따음표("")로 묶어 버린다
56,"10,000","1,500",300,890,"2,360,050",704
큰따음표로 모두 묶어버리면 좋겠지만
콤마가 없는 데이터는 그대로 두고 (위에서 56, 300, 890, 704)
콤마가 있는 데이터만 묶는 경우가 있다
우리는 이럴때를 가정해서 살펴볼 것이다.
왜냐하면 보통 이런 경우를 고려하지 않는 뷰어가 꽤 있기 때문이다
당황 하지 말고 코딩인으로써 해결하자~
먼저, 첫번째 큰따음표를 기준으로 나누자.
private String[] divideText(String text) {
//문자열안에서 첫번째 큰따음표의 위치를 찾는다
int index = text.indexOf("\"");
if (index >= 0) {
//큰따음표가 첫문자 또는 마지막에 있으면 널을 반환하여 알린다
int resultindex = index + 1;
return new String[]{(index > 0 ? text.substring(0, index) : null), (resultindex < text.length() ? text.substring(resultindex) : null)};
}
//찾지 못하면 널을 반환하여 알린다
return null;
}
그 다음은 위의 함수로
큰따음표 안의 문자열과 바깥(앞,뒤) 문자열을 추출하자
바깥 앞 "안" 바깥 뒤
56,"10,000","1,500",300,890,"2,360,050",704
private String[] getText(String text) {
//데이터 문자열을 첫번째 큰따음표로 나눈다
String[] subtexts = divideText(text);
if (subtexts == null) {
//큰따음표가 더이상 없다면
//바깥 앞 문자열 마지막에 콤마를 찍는다
//이는 언제나 문자열 양끝에 콤마가 존재해야 하기 때문이다
if (text.length() > 0)
return new String[] {text + ",", null, null};
}
else {
String[] result = {null, null, null};
//divideText의 앞 문자열을 바깥 앞 문자열로 설정한다
result[0] = subtexts[0];
//divideText의 뒤 문자열은 다시 큰따음표로 나눈다
String[] backtexts = divideText(subtexts[1]);
if (backtexts != null) {
//다시 나누어진 앞 문자열은 큰따음표 안의 문자열
result[1] = backtexts[0];
//뒤 문자열은 큰따음표 바깥 뒤 문자열
result[2] = backtexts[1];
}
return result;
}
return null;
}
자, 이젠 데이터를 추출해 보자
private ArrayList<String> getItemList(String text) {
ArrayList<String> itemlist = new ArrayList<>();
while (text != null) {
String[] subtexts = getText(text);
if (subtexts == null)
break;
//바깥 앞의 문자열은 큰따음표가 없는 데이터이다
String fronttext = subtexts[0];
if (fronttext != null && fronttext.length() > 1) {
//양끝의 콤마를 제거 한다
if (fronttext.charAt(0) == ',')
fronttext = fronttext.substring(1);
int lastindex = fronttext.length() - 1;
if (fronttext.charAt(lastindex) == ',')
fronttext = fronttext.substring(0, lastindex);
//콤마를 기준으로 나눠서 저장한다
String[] addtexts = fronttext.split(",");
for (int i = 0 ; i < addtexts.length ; i++)
itemlist.add(addtexts[i]);
//만약 마지막에 콤마가 있다면
//빈데이터가 하나 더 있는것이므로 따로 저장한다
if (fronttext.charAt(fronttext.length() - 1) == ',')
itemlist.add("");
}
//안의 문자열은 그대로 저장한다
String contentstext = subtexts[1];
if (contentstext != null)
itemlist.add(contentstext);
//바깥 뒤의 문자열은 계속 데이터를 추출할 수 있도록 해준다
text = subtexts[2];
}
return itemlist;
}
확인해 보자~
ArrayList<String> itemlist = getItemList("56,\"10,000\",\"1,500\",300,890,\"2,360,050\",704");
for (int i = 0 ; i < itemlist.size() ; i++)
Log.e("MyLog", "itemlist: " + itemlist.get(i));
itemlist: 56
itemlist: 10,000
itemlist: 1,500
itemlist: 300
itemlist: 890
itemlist: 2,360,050
itemlist: 704
도움이 되셨다면~ 정성으로 빚은 저희 앱! 많은 이용 바래요:)
https://meorimal.com/index.html?tab=spaceship
https://meorimal.com/subway.html
'개발 > android' 카테고리의 다른 글
ListView에 EditText를 넣을때 반드시 살펴봐야 할점 (0) | 2017.09.11 |
---|---|
부등호 없는 부등식 소스를 짜보자 (0) | 2017.06.27 |
막대 그래프의 처음은 이렇게 (0) | 2016.10.24 |
재귀 함수의 완벽한 이해 (0) | 2016.09.26 |
TimePicker, DatePicker, NumberPicker의 폰트 바꾸기 (0) | 2016.07.18 |