본문 바로가기
개발/android

간단한 코딩으로 큰따음표("")로 묶인 CSV 파일 보기

by 매몰 2016. 11. 14.

 

 

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

 

우주선 - 방치형 인공지능 투자 체험기

미리 맛보는 인공지능 투자!

(주)머리말 meorimal.com

 

https://meorimal.com/subway.html

 

지하철어디있니

더이상 고민하지 마세요. 뛸지 말지 딱 보면 알죠.

(주)머리말 meorimal.com

 

사업자 정보 표시
주식회사 머리말 | 고영진 | 서울특별시 송파구 중대로 135 서관 10층 (가락동, 아이티벤처타워) | 사업자 등록번호 : 524-88-00727 | TEL : 010-9990-3674 | Mail : gyjmeba@hanmail.net | 통신판매신고번호 : 2017-서울강남-03941호 | 사이버몰의 이용약관 바로가기