카톡 대화 분석기를 만들면서 가장 손이 많이 간 부분은 통계나 결과 카드가 아니라 파일을 읽는 일이었습니다. 같은 “대화 내용 내보내기”인데도 어느 기기에서 내보냈느냐에 따라 파일 모양이 꽤 다르기 때문입니다. 이 글에서는 기기별로 무엇이 다른지, 분석기가 그 차이를 어떻게 처리하는지 정리합니다. 아래 예시 대화는 모두 설명을 위해 지어낸 것입니다.
파서가 하는 일
파일을 읽어 “누가, 언제, 무슨 말을 했는지”로 정리하는 코드를 파서(parser)라고 부릅니다. 카톡 내보내기 파일은 사람이 읽기 좋은 텍스트일 뿐, 컴퓨터가 바로 셀 수 있는 표가 아닙니다. 그래서 파서가 한 줄씩 보면서 다음 셋 중 무엇인지 판단합니다.
- 날짜 구분 줄: 여기서부터 어느 날의 대화인지 알려 주는 줄
- 메시지 줄: 보낸 사람, 시각, 본문이 담긴 줄
- 시스템 메시지: 입장, 퇴장, 초대처럼 사람이 쓴 말이 아닌 알림
이렇게 나눈 결과로 참여자별 메시지 수, 시간대별 활동 같은 통계를 계산합니다. 줄을 잘못 나누면 없는 참여자가 생기거나 알림이 수다로 세어지기 때문에, 파서가 틀리면 그 뒤의 모든 숫자가 틀립니다.
기기별로 이렇게 다르다
안드로이드: 모든 줄에 날짜가 붙는다
안드로이드 파일은 메시지마다 날짜와 시각이 전부 붙어 있습니다.
모임 4 카카오톡 대화
저장한 날짜 : 2026년 3월 2일 오후 9:10
2026년 3월 1일 오후 8:30
2026년 3월 1일 오후 8:30, 민지 : 오늘 저녁 뭐 먹지
2026년 3월 1일 오후 8:31, 준호 : 나는 아무거나
2026년 3월 1일 오후 8:35, 서연님이 나갔습니다.
한 가지 특징은 단톡방이면 첫 줄의 방 이름 뒤에 인원수가 붙는다는 점입니다. 위의 모임 4에서 4는 방 인원입니다. 분석기는 안드로이드 파일일 때만 이 숫자를 떼어 방 이름은 “모임”, 인원은 4명으로 읽습니다. 다른 기기 파일은 인원수를 붙이지 않으므로 “스터디 2”처럼 원래 숫자로 끝나는 방 이름을 잘못 자르지 않도록 구분했습니다.
이 인원수는 분석에도 쓰입니다. 단톡방이라도 파일 기간 안에 두 명만 말했다면 1:1 대화로 오해하기 쉬운데, 제목에 적힌 인원이 3명 이상이면 단톡방으로 봅니다.
아이폰: 날짜는 한 번, 메시지 줄에는 시각만
아이폰 파일은 날짜 구분 줄이 나온 뒤, 메시지 줄에는 시각만 적습니다.
2026년 3월 1일 일요일
오후 8:30, 민지 : 오늘 저녁 뭐 먹지
오후 8:31, 준호 : 나는 아무거나
그래서 파서는 마지막으로 본 날짜를 기억해 두었다가 시각과 합칩니다. 공개된 다른 파서의 테스트를 참고해, 줄마다 2026. 3. 1. 오후 8:30,처럼 날짜가 붙는 예전 형식과 영어 설정 형식(Mar 1, 2026 at 20:30, 민지 : hi, 24시간제)도 읽도록 만들었습니다. 영어 설정 파일은 첫 줄에 방 이름 대신 파일 이름이 들어오는 경우가 있어, 이때는 방 이름을 비워 둡니다.
Windows PC: 대괄호와 단독 줄
PC 카톡 파일은 생김새가 가장 다릅니다. 날짜는 긴 줄표 사이에 들어가고, 메시지는 이름과 시각을 대괄호로 감쌉니다.
--------------- 2026년 3월 1일 일요일 ---------------
[민지] [오후 8:30] 오늘 저녁 뭐 먹지
[준호] [20:31] 나는 아무거나
서연님을 초대하였습니다.
시각은 설정에 따라 오후 8:30처럼 오전·오후로 적히기도 하고 20:31처럼 24시간제로 적히기도 해서 둘 다 받습니다. 영어 설정의 날짜 줄(Sunday, March 1, 2026)도 읽습니다.
눈여겨볼 점은 두 가지입니다. 첫째, 초대·나가기 같은 시스템 메시지가 보낸 사람도 시각도 없는 단독 줄로 나옵니다. 이런 줄에는 바로 앞 메시지의 시각을 붙입니다. 둘째, 실제 PC 파일을 받아 보니 단톡방도 첫 줄이 “○○ 님과 카카오톡 대화” 형식이었습니다. 제목만 보고 1:1 대화라고 판단하면 틀리기 때문에, 대화 종류는 제목이 아니라 실제로 말한 참여자 수로 정합니다.
Mac: 표 형식(CSV) 파일
Mac은 텍스트 파일이 아니라 .csv 파일로 저장합니다. CSV는 쉼표로 칸을 나눈 표 형식으로, 엑셀에서도 열 수 있습니다.
Date,User,Message
2026-03-01 20:30:00,"민지","오늘 저녁 뭐 먹지"
2026-03-01 20:31:00,"준호","나는 아무거나, 근데 ""매운 거""는 빼고"
첫 줄이 Date,User,Message이면 Mac 파일로 보고 표를 읽는 방식으로 처리합니다. 본문 안의 쉼표나 줄바꿈은 큰따옴표로 감싸져 있고, 본문 속 큰따옴표는 두 번 겹쳐 적혀 있어서("") 이 규칙대로 풀어냅니다. Mac에서는 “OO left this chatroom.” 같은 알림도 User 칸에 당사자 이름이 들어 있어서, 본문이 그 이름으로 시작하는 알려진 알림 문구일 때만 시스템 메시지로 봅니다. 그래서 누군가 직접 “I invited him.“이라고 쓴 메시지는 그대로 메시지로 남습니다.
어느 기기 파일인지 알아내는 방법
사용자에게 “어느 기기에서 내보냈나요?“라고 묻지 않고 파일만 보고 판단합니다. 순서는 이렇습니다.
- 첫 줄이
Date,User,Message이면 Mac입니다. - 아니면 첫 줄(방 이름)과 둘째 줄(
저장한 날짜 : …)을 머리말로 건너뜁니다. - 그다음 최대 500줄을 Windows, 안드로이드, 아이폰 형식에 각각 대 보고, 가장 많은 줄이 들어맞는 형식을 고릅니다.
한 줄만 보고 정하지 않는 이유는 대화 본문에도 날짜처럼 생긴 글이 얼마든지 있을 수 있기 때문입니다. 여러 줄을 세어 보면 어느 쪽인지 분명해집니다.
까다로운 경우들
여러 줄 메시지
메시지 안에서 줄을 바꾸면 파일에서도 줄이 나뉩니다. 날짜나 이름이 없는 줄은 바로 앞 메시지에 이어 붙입니다. 지도 공유처럼 여러 줄로 된 메시지나 중간에 빈 줄이 있는 공지도 이렇게 한 메시지로 묶입니다.
2026년 3월 1일 오후 8:40, 민지 : 모임 공지
일시 3월 14일 토요일
장소 역 앞 카페
메시지 속에 알림처럼 생긴 문장이 있을 때
여기서 문제가 하나 생깁니다. 누군가 메시지에 “준호님이 나갔습니다.“라고 적고 줄을 바꿨다면, 그 줄은 시스템 메시지일까요, 메시지의 일부일까요? 안드로이드와 아이폰에서는 시스템 메시지에도 시각이 붙기 때문에, 시각 없는 줄은 이어지는 줄로 봅니다. 실제 안드로이드 파일에서 시각 없이 단독으로 나오는 알림은 “메시지가 삭제되었습니다.” 하나뿐이어서 이것만 예외로 처리합니다.
반대로 Windows는 시스템 메시지가 원래 단독 줄로 나오기 때문에 더 조심스럽게 봅니다. 알려진 알림 문구이거나, 다음 세 조건을 모두 만족하는 문장만 시스템 메시지로 떼어 냅니다.
- 한 줄 전체가 “…했습니다.” 같은 과거형 존댓말로 끝난다
- “○○님이/님을” 또는 방장·관리자가 주어다
- 가리기, 지정, 변경, 초대 같은 채팅방 관리 동작을 뜻하는 낱말이 들어 있다
그래서 “부방장으로 지정되었습니다” 같은 알림은 이벤트가 되고, 누군가 쓴 “준호님이 고생했습니다.“는 메시지 본문으로 남습니다.
이름이나 본문에 쉼표·콜론이 들어 있을 때
안드로이드와 아이폰은 이름 : 본문처럼 공백을 둔 콜론으로 이름과 본문을 나눕니다. 이름에 쉼표가 들어 있거나, 본문에 “장소 : 역 앞”처럼 콜론이 있어도 처음 나오는 :에서 나누므로 이름과 본문이 섞이지 않습니다. 다만 “민지님이 채팅방 이름을 ’a : b’로 변경했습니다.“처럼 시스템 문장 안에 :가 있으면 “민지님이 채팅방 이름을 ’a”라는 가짜 참여자가 생길 수 있습니다. 이름 칸에 “님이 “ 같은 조각이 있고 문장 전체가 시스템 문장이면 시스템 메시지로 되돌리는 규칙을 넣어 막았습니다.
사진, 이모티콘, 삭제된 메시지
내보내기 파일에는 사진 자체가 들어 있지 않고 사진, 사진 3장, 동영상, 이모티콘 같은 한 단어 본문만 남습니다. 분석기는 이 문구로 메시지 종류를 나누고, 사진 3장은 사진 3장으로 셉니다. 본문에 http로 시작하는 주소가 있으면 링크로 셉니다. 입장, 퇴장, 초대, 내보내기 알림과 안드로이드의 단독 줄 삭제 알림은 사람이 보낸 메시지에서 빼서 따로 모으고, 수다왕 같은 통계는 이것들을 뺀 뒤에 계산합니다.
채팅봇
실제 단톡방 파일을 분석해 보니 카톡 채팅봇이 보낸 메시지와 “@채팅봇 …” 같은 명령이 섞여 있었습니다. 이것을 그대로 세면 봇이 수다왕이 되고, 퀴즈를 하던 날이 ’가장 대화가 많았던 날’이 됩니다. 그래서 보낸 사람이 “채팅봇”인 메시지와 봇 명령은 사람의 대화에서 제외합니다.
그 밖의 처리
- 줄바꿈 방식(Windows식 CRLF, 예전 Mac식 CR, 일반 LF)이 달라도 똑같이 읽습니다.
- 파일 맨 앞의 보이지 않는 표시 문자(BOM)는 지웁니다.
- 압축을 풀지 않은
.zip파일을 올리면 “텍스트 메시지만 보내기”로 받은 파일을 고르라고 안내합니다. - 시각은 시간대 변환 없이 파일에 적힌 시각 그대로 씁니다. 저녁 8시에 보낸 메시지는 어디서 분석해도 저녁 8시입니다.
해석하지 못한 줄은 숨기지 않는다
어떤 규칙에도 맞지 않는 줄은 버리되, 몇 줄을 버렸는지 셉니다. 해석 못 한 줄이 전체의 5%를 넘으면 결과 화면에 “일부 줄을 해석하지 못해 결과가 정확하지 않을 수 있어요”라는 안내를 띄웁니다. 아예 형식을 알아보지 못하거나 메시지를 하나도 찾지 못하면, 어떤 파일을 골라야 하는지와 기기별 내보내기 방법 링크를 보여 줍니다.
아직 확인하지 못한 것
솔직하게 적어 두면, 모든 형식을 실제 파일로 확인한 것은 아닙니다.
- 실제 파일로 확인한 것: Windows PC 단톡방과 안드로이드 단톡방입니다. 날짜·메시지 줄, 여러 줄 메시지, 링크,
사진·사진 3장·동영상·이모티콘, 단독 줄로 나오는 삭제 알림, 채팅봇을 이 파일들로 확인했고, 이름과 내용을 바꾼 사본을 테스트에 넣어 고정했습니다. - 공개 파서의 테스트를 참고해 만든 것: 아이폰(한국어, 예전 형식, 영어)과 Mac 형식입니다. 직접 만든 예시로 테스트는 하고 있지만, 실제 아이폰·Mac 파일로는 아직 확인하지 못했습니다.
- 문구를 확인하지 못한 것: “들어왔습니다”, “내보냈습니다” 같은 입장·강퇴 알림, 파일·음성메시지·가리기 문구, 그리고 안드로이드 영어 설정 파일입니다. 코드에 추정 문구를 넣어 두었지만 실제와 다를 수 있습니다.
테스트용 단톡방을 만들어 이런 상황을 일부러 만든 뒤 내보내는 방식으로 샘플을 모으고 있고, 새 샘플이 생기면 같은 방식으로 테스트에 추가할 계획입니다.
직접 써 보기
어느 기기에서 내보냈든 파일을 그대로 올리면 형식은 분석기가 알아서 판단합니다. 파일은 서버로 보내지 않고 브라우저 안에서만 읽습니다. 내 단톡방은 어떤 결과가 나오는지 카톡 대화 분석기에서 확인해 보세요. 내보내는 방법이 헷갈리면 사이트의 기기별 안내를 참고하시면 됩니다.