쉼표로 입력받은 문자열을 Split으로 나눴는데 배열 중간에 빈 값이 생기거나, 항목 앞뒤 공백이 그대로 남는 경우가 있습니다. 특히 사과,바나나,, 포도 , ,복숭아,처럼 구분자가 연속되거나 공백만 있는 항목이 섞이면 RemoveEmptyEntries 하나만으로는 결과가 깔끔해지지 않습니다.
이 글에서는 빈 문자열을 제외하는 방법과 공백만 있는 항목까지 제거하는 방법을 실제 실행 결과로 비교합니다. 기존의 C# Split 기본 사용법이 구분자로 문자열을 나누는 기본 형태를 다뤘다면, 여기서는 빈 항목과 공백 정리에 초점을 맞춥니다.

테스트 환경과 원본 문자열
- Windows 10 22H2
- .NET SDK 8.0.130
- C# 콘솔 프로젝트, 대상 프레임워크
net8.0 - 실행 확인일 : 2026년 8월 31일
비교에 사용한 원본 문자열은 다음과 같습니다.
string source = " 사과,바나나,, 포도 , ,복숭아,";
이 문자열에는 세 가지 확인 지점이 있습니다.
바나나다음에는 쉼표가 두 번 이어져 길이가 0인 항목이 생깁니다.포도앞뒤에는 공백이 있습니다.포도와복숭아사이에는 공백 세 칸만 들어 있는 항목이 있습니다.
옵션 없이 Split하면 빈 항목도 배열에 남습니다
먼저 기본 옵션인 StringSplitOptions.None으로 나눠 보겠습니다.
string[] items = source.Split(',', StringSplitOptions.None);
직접 실행한 결과는 배열 길이가 7이었습니다.
[None] count = 7
0: < 사과>
1: <바나나>
2: <>
3: < 포도 >
4: < >
5: <복숭아>
6: <>
연속된 쉼표 사이와 문자열 마지막 쉼표 뒤에 빈 문자열이 만들어집니다. < >는 빈 문자열처럼 보여도 실제로는 공백 세 칸이 들어 있으므로 길이가 0이 아닙니다.
RemoveEmptyEntries만 사용했을 때 남는 값
길이가 0인 배열 요소를 제외하려면 StringSplitOptions.RemoveEmptyEntries를 지정합니다.
string[] items = source.Split(
',',
StringSplitOptions.RemoveEmptyEntries);
[RemoveEmptyEntries] count = 5
0: < 사과>
1: <바나나>
2: < 포도 >
3: < >
4: <복숭아>
배열 길이는 7에서 5로 줄었지만 < >가 남아 있습니다. RemoveEmptyEntries는 길이가 0인 문자열을 제외할 뿐, 항목의 공백을 먼저 지우지는 않기 때문입니다. 사용자 입력에 , ,처럼 공백만 있는 칸이 들어올 수 있다면 이 옵션 하나로는 부족합니다.
TrimEntries를 함께 사용하면 공백 항목도 제거됩니다
항목의 앞뒤 공백까지 정리하려면 두 옵션을 | 연산자로 함께 지정합니다.
string[] items = source.Split(
',',
StringSplitOptions.RemoveEmptyEntries |
StringSplitOptions.TrimEntries);
[RemoveEmptyEntries | TrimEntries] count = 4
0: <사과>
1: <바나나>
2: <포도>
3: <복숭아>
TrimEntries가 각 항목의 앞뒤 공백을 먼저 정리하고, RemoveEmptyEntries가 빈 결과를 제외합니다. 그래서 공백 세 칸뿐이던 항목도 최종 배열에서 빠집니다.
Microsoft 문서에서도 두 옵션을 함께 지정하면 공백 문자로만 이루어진 부분 문자열이 결과에서 제거된다고 설명합니다. TrimEntries는 .NET 5 이상에서 사용할 수 있으므로 오래된 .NET Framework 프로젝트에서는 각 항목에 Trim()을 적용하는 방식이 필요합니다.
쉼표와 세미콜론을 모두 구분자로 사용하기
입력 문자열에 쉼표와 세미콜론이 섞여 있다면 char[]에 구분자를 모아서 전달할 수 있습니다.
string mixed = "C#; Java,Python;; SQL";
char[] separators = { ',', ';' };
string[] languages = mixed.Split(
separators,
StringSplitOptions.RemoveEmptyEntries |
StringSplitOptions.TrimEntries);
[여러 구분자] count = 4
0: <C#>
1: <Java>
2: <Python>
3: <SQL>
여기서 배열에 넣은 ','와 ';'는 각각 독립된 한 글자 구분자입니다. "--"나 "[stop]"처럼 여러 글자로 된 구분자가 필요하면 string[] 오버로드를 사용해야 합니다.
string source = "ONE[stop][stop]TWO[stop] THREE";
string[] separators = { "[stop]" };
string[] values = source.Split(
separators,
StringSplitOptions.RemoveEmptyEntries |
StringSplitOptions.TrimEntries);
전체 실행 코드
아래 코드는 네 가지 결과를 한 번에 비교합니다.
static void Print(string title, string[] values)
{
Console.WriteLine($"[{title}] count = {values.Length}");
for (int i = 0; i < values.Length; i++)
{
Console.WriteLine($"{i}: <{values[i]}>");
}
Console.WriteLine();
}
string source = " 사과,바나나,, 포도 , ,복숭아,";
Print(
"None",
source.Split(',', StringSplitOptions.None));
Print(
"RemoveEmptyEntries",
source.Split(',', StringSplitOptions.RemoveEmptyEntries));
Print(
"RemoveEmptyEntries | TrimEntries",
source.Split(
',',
StringSplitOptions.RemoveEmptyEntries |
StringSplitOptions.TrimEntries));
string mixed = "C#; Java,Python;; SQL";
char[] separators = { ',', ';' };
Print(
"여러 구분자",
mixed.Split(
separators,
StringSplitOptions.RemoveEmptyEntries |
StringSplitOptions.TrimEntries));
실행할 때 자주 헷갈리는 부분
TrimEntries에서 컴파일 오류가 나는 경우
'StringSplitOptions' does not contain a definition for 'TrimEntries' 오류가 난다면 프로젝트의 대상 프레임워크를 먼저 확인합니다. TrimEntries는 .NET 5 이상에서 제공되며 .NET Framework 4.x에는 없습니다.
오래된 프로젝트에서는 다음처럼 나눈 뒤 Trim()과 조건문으로 처리할 수 있습니다.
string[] items = source
.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
.Select(item => item.Trim())
.Where(item => item.Length > 0)
.ToArray();
CSV 파일은 단순 Split으로 처리하지 않기
홍길동,"서울, 강남",30처럼 따옴표 안에 쉼표가 들어가는 CSV는 Split(',')만 사용하면 열이 잘못 나뉩니다. 이 글의 코드는 단순한 구분 문자열 입력에 맞는 방법입니다. 실제 CSV 파일은 따옴표, 줄바꿈, 이스케이프 규칙을 처리하는 CSV 파서를 사용하는 편이 안전합니다.
어떤 옵션을 선택하면 되는가
빈 문자열도 위치 정보로 사용해야 한다면 None을 유지합니다. 예를 들어 A,,C의 두 번째 칸이 비어 있다는 사실이 중요할 수 있습니다.
반대로 태그, 기술 목록, 간단한 입력값처럼 실제 내용이 있는 항목만 필요하다면 RemoveEmptyEntries | TrimEntries 조합이 실수하기 어렵습니다. 나눈 문자열을 다시 하나로 합쳐야 할 때는 C# String.Join으로 배열과 List 문자열 합치기를 이어서 확인할 수 있습니다. 공백 제거 자체가 목적이라면 C# Trim, TrimStart, TrimEnd 차이도 함께 보면 좋습니다.
참고 문서
'IT프로그래밍 > C Sharp' 카테고리의 다른 글
| C# IndexOf 사용법 : 문자열 위치 찾기와 -1 반환값 (0) | 2026.07.26 |
|---|---|
| C# 문자열 자르기 : Substring과 범위 연산자 사용법 (0) | 2026.07.24 |
| C# Contains 사용법 : 문자열 포함 여부와 대소문자 무시 검색 (0) | 2026.07.21 |
| C# String.Join 사용법 : 배열과 List 문자열 합치기 (0) | 2026.07.18 |
| C# Replace 사용법 : WinForms 문자열 찾기와 바꾸기 만들기 (0) | 2026.07.16 |
| C# 문자열 공백 제거 : Trim, TrimStart, TrimEnd 사용법 (0) | 2026.07.16 |
| C# WinForms DataGridView BindingList 사용법 : 행 추가와 삭제 자동 반영 (0) | 2026.07.11 |
| C# WinForms DataGridView 사용법 : 행 추가와 선택 값 가져오기 (0) | 2026.07.09 |
댓글