728x90
이번 시간에는 간단한 품번 비교 프로그램을 만들어 보겠습니다.
회사에서 업무를 하다가 동료로부터 Sheet1에 있는 품목 번호와 Sheet2에 있는 품목 번호를 비교해야 하는데
쉬운 방법이 있는지 문의를 받은 적이 있습니다.
두 개의 쉬트에서 약 800개의 자료를 비교해야 하는데, 일일이 대조하는 것은 거의 불가능하고
설령 눈으로 비교했더라도 완벽한지는 장담할 수 없는 상황입니다.
그래서, 간단하게 텍스트를 비교하는 프로그램을 만들어서 일을 도와드린 적이 있는데
그때 사용한 프로그램을 같이 만들어 보기로 하겠습니다.
1. 프로젝트 생성
- Visual Studio 2022를 이용해서 Windows Forms 앱 (.Net Framework) 프로젝트 만들기
- 프로젝트 명, 작업 디렉토리 선택 후 "만들기" 클릭
2. 프로그램 개발 목표
- A, B 두 그룹의 텍스트를 비교해서
- A 그룹에만 있는 항목 표시 (A 차집합 구하기)
- B 그룹에만 있는 항목 표시 (B 차집합 구하기)
3. 화면 디자인
- A 그룹 텍스트 입력용 TextBox 1개
- B 그룹 텍스트 입력용 TextBox 1개
- A 차집합 결과 표시용 TextBox 1개
- B 차집합 결과 표시용 TextBox 1개
- 실행 버튼 1개를 만들어서 배치한다.
- 입력을 편리하게 하기 위해 TextBox는 Multiline, Scrollbar=Vertical을 설정한다.
4. 프로그램 구현 (코딩)
- 차집합을 구하는 문제는 List의 Except 메서드를 사용하면 쉽게 구할 수 있다.
- 교집합을 구하는 문제는 List의 Intersect 메서드를 사용하면 쉽게 구할 수 있다.
- 합집합을 구하는 문제는 List의 Union 메서드를 사용하면 쉽게 구할 수 있다.
- List 이용하여 대소문자 구분하지 않는 StringComparer.OrdinalIgnoreCase를 사용한다.
- 엑셀에서 행 단위 문자열은 Split을 이용하되 엔터키 값을 이용하여 분리한다.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace TextCompare
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//비교 텍스트 박스 초기화
txtGroupA.Text = string.Empty;
txtGroupB.Text = string.Empty;
//결과 텍스트 박스 초기화
txtResultA.Text = string.Empty;
txtResultB.Text = string.Empty;
}
private void btnAct_Click(object sender, EventArgs e)
{
//결과 텍스트 박스 초기화
txtResultA.Text = string.Empty;
txtResultB.Text = string.Empty;
List<string> lstSources = new List<string>();
List<string> lstTargets = new List<string>();
string sourceTxt = txtGroupA.Text;
string targetTxt = txtGroupB.Text;
//엔터키 값을 기준으로 배열로 분리한다.
string[] arrSourceTxt = sourceTxt.Split(new string[] { "\n", "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
string[] arrTargetTxt = targetTxt.Split(new string[] { "\n", "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
//배열 값을 반복하며 List에 저장한다.
foreach (string sItem in arrSourceTxt)
{
string sTxt = sItem.Trim(); //좌우 공백을 없앤다
if (!string.IsNullOrWhiteSpace(sTxt))
{
lstSources.Add(sTxt);
}
}
//배열 값을 반복하면 List에 저장한다.
foreach (string tItem in arrTargetTxt)
{
string tTxt = tItem.Trim(); //좌우 공백을 없앤다
if (!string.IsNullOrWhiteSpace(tTxt))
{
lstTargets.Add(tTxt);
}
}
//List Except를 사용하여 차집합을 구한다.
List<string> lstSourceResults = lstSources.Except(lstTargets, StringComparer.OrdinalIgnoreCase).ToList();
//차집합 결과값은 결과 텍스트 박스에 표시한다.
foreach (var item in lstSourceResults)
{
txtResultA.Text += item + "\r\n"; //엔터키를 통해서 줄 구분
}
//List Except를 사용하여 차집합을 구한다.
List<string> lstTargetResults = lstTargets.Except(lstSources, StringComparer.OrdinalIgnoreCase).ToList();
//차집합 결과값은 결과 텍스트 박스에 표시한다.
foreach (var item in lstTargetResults)
{
txtResultB.Text += item + "\r\n"; //엔터키를 통해서 줄 구분
}
}
}
}
5. 결과 확인
오늘의 개발 팁
List 차집합 = Except
List 교집합 = Intersect
List 합집합 = Union
대소문자 무시하고 비교 = StringComparer.OrdinalIgnoreCase
이번 시간에는 간단하게 텍스트를 비교해서 차집합을 구하는 방법을
C# 윈폼(Winform)을 이용해서 프로그램을 만들어 보았습니다.
위에서 언급한 것과 같이 문자열 목록을 비교하는 많은 방법이 있지만
List를 이용하면 쉽게 구할 수 있으니 참고해 주세요.
첨부된 파일을 참고해서 각자가 원하는 대로 수정해서 개발해 보세요.
반응형
'팁 & 노하우 > C#' 카테고리의 다른 글
Vue js 3, v-html button click event 처리 (버튼 클릭 이벤트) (0) | 2024.02.26 |
---|---|
영화진흥위원회 오픈API 활용 C#, .net 8.0, MVC, Vue.js (0) | 2024.02.20 |
C# 날짜 시간 변환 format 과 DateTime.ParseExact 만 알면 뭐든지 해결 (0) | 2023.11.06 |
c# 반복문 foreach, for 에서 인덱스 번호 가져오기 (0) | 2023.11.02 |
C# (asp.net) 날짜 차이, 시간 차이 구하기 - 초보 개발자 레벨 업~ (1) | 2023.10.19 |