/////
Search

221031

작성자
조예지
최민준
날짜
2022/10/31
학습 내용
DI,병원 데이터 parsing
텍스트

@Autowired - 최민준

내용

public class CafeStudy implements StudyService {....} public class SchoolStudy implements StudyService {....}
public class CafeStudy implements StudyService {....} public class SchoolStudy implements StudyService {....}

정규 표현식 - 조예지

 CSV 파일에서는 comma 있는 자료는 쌍따옴표로 묶인다.

1,의원,01_01_02_P,3620000,PHMA119993620020041100004,19990612,,1,영업/정상,13,영업중,,,,,062-515-2875,,500881,광주광역시 북구 풍향동 565번지 43,"광주광역시 북구 동문대로 24, 3층 (풍향동)",61205,효치과의원,2.02111E+13,U,2021.11.17 2:40,치과의원,192630.7351,185314.6176,치과의원,1,0,0,52.29,401,치과,,,,0,0,,,0,
Java
복사

1. 정규표현식을 이용하여 쌍따옴표 안에 있는 콤마를 제거한 후 쌍따옴표도 제거한다.

public Hospital parse(String str) { String[] row = str.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)", -1); try{ int id = Integer.parseInt(row[0]); String service = row[1]; int localCode = Integer.parseInt(row[3]); String manageNum = row[4]; LocalDateTime licenseDate = strConverterToDate(row[5]); int businessStatus = Integer.parseInt(row[7]); int businessCode = Integer.parseInt(row[9]); String phone = row[15]; String address = row[18].replace("\"",""); String roadAddress = row[19].replace("\"",""); ...
Java
복사
(?=) (전방 탐색, looahead) : 작성한 패턴에 일치하는 영역이 존재하여도 그 값이 제외되어서 나오는 패턴
= 다음에 오는 문자가 일치하는 영역에서 제외된다.
.split() : limit (두번째 파라미터)를 음수로 주면 모든 구분값을 나눠서 배열로 반환한다.
양수면 배열의 길이를 지정하여, 지정된 크기만큼 나눠진다.
파싱할 때는 열이 일정해야 하므로 공백도 배열에 들어가게 해야한다.

2. 라이브러리 사용

OpenCSV 라이브러리 사용
Parser + ReadLineContext 역할
1.
dependency 설정
//gradle implementation 'com.opencsv:opencsv:5.5' //maven <dependency> <groupId>com.opencsv</groupId> <artifactId>opencsv</artifactId> <version>5.5.2</version> </dependency>
Java
복사
2.
실행
code
예외 처리는 깔끔하지 않음
예외 처리가 달라서 앞에는 111918개 나왔는데, 이 방식으로는 113829개 나온다.

⭕️ 정규식

public Hospital parse(String str) { String[] row = str.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)", -1); try{ int id = Integer.parseInt(row[0]); String service = row[1]; int localCode = Integer.parseInt(row[3]); String manageNum = row[4]; LocalDateTime licenseDate = strConverterToDate(row[5]); int businessStatus = Integer.parseInt(row[7]); int businessCode = Integer.parseInt(row[9]); String phone = row[15]; String address = row[18].replace("\"",""); String roadAddress = row[19].replace("\"",""); ...
Java
복사
regex : regular expression

사용

텍스트에서 원하는 패턴을 찾을 때 (전화번호, 웹주소)
다른 문자열로 변환도 가능하다.
입력한 데이터가 특정한 패턴에 부합하는지 유효성 검사
프로그래밍 언어, 에디터에서도 지원한다.

문법

/ 안에 패턴을 넣고 flag로 옵션 지정

Groups and ranges

| 또는
() 그룹
[ ] 문자 셋이상, 괄호 안의 어떤 문자든
[^] 부정 문자 셋, 괄호 안의 어떤 문자가 아닐 때
(?:) 찾지만 기억하지는 않음

Quantifiers

문자 또는 그룹 뒤에 붙여서
? 없거나 있거나 (zero or one)
*없거나 있거나 많거나 (zero or more)
+하나 또는 많이 (one or more)
{n} n번 반복
{min,} 최소
{min, max} 최소, 그리고 최대

Boundary-type

\b 단어 경계
\B 단어 경계가 아님
^ 문장의 시작
$ 문장의 끝

Character classes

\ 특수 문자가 아닌 문자
. 어떤 글자 (줄바꿈 문자 제외)
\d digit 숫자
\D digit 숫자 아님
\w word 문자
\W word 문자 아님
\s space 공백
\S space 공백 아님

flag

global : 매칭되는 다양한 결과값 기억
case insensitive : 대소문자 구분 없이
multiline
single line(dotall)
unicode
sticky

연습1. 전화번호 찾기

다양한 전화번호를 선택하는 정규표현식을 작성해보자.
010-898-0893 010-405-3412 02.878.8888 010 2033 4845
Java
복사
/\d{2,3}[-. ]\d{3,4}[-. ]\d{4}/gm
Java
복사

연습2. 이메일 선택하기

dream.coder.ellie@gmail.com hello@daum.net hello@daum.co.kr
Java
복사
/[a-zA-Z0-9_-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9.]+/gm
Java
복사

연습3.유튜브 주소에서 아이디만 가져오기

https://www.youtu.be/-ZClicWm0zM https://youtu.be/-ZClicWm0zM youtu.be/-ZClicWm0zM
Java
복사
/(?:https?:\/\/)?(?:www\.)?youtu.be\/([a-zA-Z0-9-]{11})/gm
Java
복사
정규표현식 연습 사이트 : regexr.com/5mhou