프로그래밍언어/VB.NET

[스크랩] [비주얼 베이직] 기초 강좌 13 : 함수 2 문자열 처리

부산딸랑이 2013. 1. 31. 21:37

강좌 13 : Functions Part 2

 

강좌12를 너무 오래 했네요.....힘이 빠진다는....자! 강좌 13을 시작합니다. 문자열 처리 함수에 관한 내용입니다.

 

추가 : 왜 이런 문자열 처리 함수가 필요할까요? 필요를 알면 훨씬 눈에 잘 들어오게 됩니다. 저는 문자열처리에 약간 목숨을 걸어야 하는 입장이구요. 가장 흔한 예로 GPS 데이터가 있습니다. 아래처럼 말이죠.

보시면 굉장히 복잡한, 콤마로 분리된 문자열이 입력되어 들어옵니다. 여기서 형광펜 칠한 부분이 위도/경도가 됩니다. 필요한 것이 경도와 위도만이라면, 위의 문자열을 조작/처리하여 위도/경도만 가져와야 겠죠. 이걸 파싱(?)한다고 합니다. 왜 문자열 처리가 필요한지 아시겠죠. 아래 예제에서는 NT-ARS라는 관성항법장치에서 피치와 롤 값을 획득하는 것을 연습해 볼 작정입니다. 저의 프로젝트의 일부죠.

 

이번 강좌는 문자열 처리에 관한 함수에 대한 것인데 기본적 함수는 강좌8에서 다루었습니다. 바로 Len( ), Left( ), 그리고 Right( ). 이제 더 유용한 문자열 처리 함수를 보도록 하죠.

 

13.1 함수 Mid( )

 

문자열 중에서 일정 부분의 문자열을 반환하는 함수이다.  이름 Mid는 보통 중간을 쪼개기 때문에 붙여진 것으로 보인다. 형식은 다음과 같다.

 

Function Mid( 대상 문자열, 자르기 시작하는 위치(start), 자를 글자수(length))  As String

 

함수의 반환값이 문자열이고, 인수에 대해서 보자면, 위의 설명 그대로이다. 만약 위치가 대상 문자열을 벗어나게 되면 "" 즉 공백을 반환한다. 그리고 글자수가 역시 초과하게되면 위치에서 끝까지 나머지 문자열을 반환하게 된다. 예제를 통해서 알아보죠.

 

예제 13.1 이번 예제에서는 앞에서 배운 InPutBox()를 이용하여 사용자 입력 문자열을 받고 이것을 적당히 잘라서 텍스트 박스에 출력하게 하는 프로그램이다. 자를 위치도 입력 받아야 하므로 컨트롤이 많이 필요하다. 일단 버튼 하나가 필요하다. 그리고 위치를 결정하는 텍스트박스가 2개에 출력용 텍스트 박스가 하나 필요하므로 총 3개의 텍스트 박스가 필요하다. 그리고 적당한 설명이 필요하므로 라벨도 3개가 필요하다. 디자인은 다음과 같다. 그리고 코드도......

 

 

위의 예제에서 크기 20의 문자열을 입력했다. 시작 위치가 4이고 길이가 5이므로 아마 결과는 45678일 것이다. 확인해보자.

 

 

대략 감이 잡힐 것이다. 몇가지를 시도하면서 익히면 될 것이다. 참 스페이스도 글자로 취급됩니다.  

 

13.2 함수 Right( )

 

강좌8에서 언급한 것처럼 문자열의 오른쪽 부분을 추출하여 반환하는 함수이다. 강좌8을 참고하고 여기서는 생략합니다.

 

13.3 함수 Left( )

 

강좌8에서 언급하였다. 문자열의 왼쪽 부분을 가져오는 함수이다. 역시 생략한다.

 

13.4 함수 Trim( )

 

문자 그대로 trim하는 함수이다. 즉 필요없는 것을 정리하는 것인데. 문자열의 양쪽 빈공간을 자른 후 그 결과 문자열을 반환한다.

예를 들면,

Trim("      트림의 기능입니다      ") = "트림의 기능입니다"

 

13.5 함수 Ltrim( )

 

역시 문자 그대로, Left trim이므로 왼쪽 공란을 자른 후 결과 문자열을 반환한다.

 

13.6 함수 Rtrim( )

 

위와 반대로 오른쪽 space를 자른 후, 그 결과문자열을 반환한다.

예를 들면,

Rtrim("    Rtrim의 기능입니다    ") = "Rtrim의 기능입니다    "

 

13.7 함수 InStr( )

 

원 튜토리얼 내용이 약간 빈약하여 MSDN의 내용을 참고하여 정리합니다. 이 함수의 인수는 4가지 입니다. 시작위치, 타겟 문자열, 검색 문자열, 마지막으로 검색 방법까지 4가지 입니다. 첫 인수와 마지막 인수는 옵션입니다.

 

지금까지 문자열 함수는 거의 문자열을 반환하였는데 이 함수는 정수를 반환합니다. 이 함수의 기능은 target 문자열에서 어떤 글자나 문자열이 맨처음 어디서 시작하는지 그 시작위치를 찾아서 그 위치를 정수값으로 반환하는 것 입니다. 즉 문자열을 비교/검색하는 함수입니다.

예를 들면,

문자열 "12345p789012P45"에서 'p'는 6번째에 처음으로 나타나므로,

InStr("12345p789012P45","p") = 6 이죠.

이렇게 검색하고 싶기도 할 것 같습니다. 즉 처음부터 검색하지 말고 9번째 글자부터 검색해서 하라고 말입니다. 그렇게 되면,

첫 인수(start)로 9가 첨가되니까,

InStr( 9, "12345p789012P45","p") = 5 입니다.

어......소문자와 대문자인데....구별되지 않습니다. 비베에서는 대/소문자가 구별되지 않습니다.(틀리면 댓글주세요) 그럼 구별하기 위해서는 어떻게 해야 할까요? 검색방법을 나타내는 마지막 인수를 binary로 지정해주면 됩니다. 상수로는 '0'인데, 그냥CompareMethod.Binary라고 합니다.

예를 들면,

InStr(1,"12345p789012P45","P",CompareMethod.Binary) = 13 이고

그에 반해, 검색방법을 텍스트로 하면,

InStr(1,"12345p789012P45","P",CompareMethod.Text) = 6 입니다.

디폴트로 Start는 1이고 검색방법은 CompareMethod.Text입니다. 즉 생략하면 이렇게 인식하고 함수가 실행됩니다.

예를 들어,

InStr("Visual Basic","Basic") = 8 입니다.

 

13.8 함수 Chr( ), Asc( )

 

사실 모든 character는 아스키(ASCII1)코드를 가지고 있습니다. 즉 'A'는 아스키코드로 65이고 'B'는 아스키코드로 66입니다. 이렇게 코드번호를 알면 문자를 알수 있고 그 반대로 가능합니다. 사실 이것은 통신에서 굉장히 중요한 것입니다. 암튼 어디서 사용할 수 있을까요?

앞 강좌에서 MsgBox( ), InPutBox( )에서 인수로 prompt가 있었습니다. 즉 대화창에 나타나는 지시사항이죠. 최대 1024자까지 가능한데, 만약 지시사항이 길어서 2줄로 표시가 된 다면 어떻게 할까요. prompt중간에 엔터키를 칠 수도 없고.....난감하죠....이때 함수 Chr( )가 요긴합니다. 줄바꿈을 나타내는 아스키코드가 존재합니다. carriage return의 아스키코드는 13이고, line feed character는 10입니다. 따라서 Chr(13)은 바로 carriage return character가 됩니다.

예를 들어 설명하면, 아래 InputBox의 prompt를 주의해서 보세요. 바로 위의 예제13.1입니다.

 

 

자 드디어 마지막 함수입니다. 좀 지겹네요. 근데 제일 중요한 함수가 남았습니다. 문자열 분리 함수입니다.

 

13.9 함수 Split()

 

이 함수는 원래의 튜토리얼에 빠진 내용입니다. 하지만 저의 프로젝트에 필요해서 여기에 정리합니다. 역시 MSDN을 참고했습니다. 영어 원문인데 만약 한글판을 원하시면 오른쪽 상단에 보면 언어선택하는 메뉴가 있습니다. 거기서 한국-한글을 선택하여 한글판을 보셔도 됩니다. 근데 번역이 매끄럽지 못한것이 많아서 그냥 영문을 참고하도록 하겠습니다.

 

Split( )은 문자 그대로, 문자열을 분할하는 함수 입니다. '뭔가'를 기준으로 문자열을 분할하는데 반환값이 문자열 배열입니다. 아직 배우지는 않은 내용인데 대충 배열이 뭔지는 아시니까 일단 넘어 갑니다.

 

문법은 다음과 같습니다.

string() = Split( 타겟 문자열, 분할 기준 문자, 분할 갯수, 분할 방법)

함수의 인수가 4개 입니다. 반드시 필요한 인수는 타겟 문자열과 기준 문자가 되겠죠. 아닙니다. 기준문자도 생략가능한데 만약 생략되면 spacer 즉 ""가 기준 문자가 됩니다. 분할 갯수는 역시 선택인데 생략하면 -1로 봅니다. 즉 분할 기준 문자로 다 나누라는 말입니다. 마지막 인수인 분할 방법은 함수 InStr()과 같습니다.

 

예를 들면 이렇습니다.

Split("a:b:c",":") 의 반환값은 배열로서 {"a", "b" , "c"} 입니다.

Split("a:b:c",":",2) 의 반환값은 :을 기준으로 2개로 나누라고 했으므로 배열로서 {"a", "b:c"}가 됩니다.

 

예제 13.2 NT-ARS는 컴터와 시리얼 통신으로 결과값을 출력하게 되는데 그 출력값은 문자열로 다음과 같습니다. 이는 저의 프로젝트의 일부입니다. GPS도 비슷합니다.

 

 

 

 

 

 

 

 

 

 

 

사실 옆의 시리얼 통신 예제도 비베2010으로 짠 것입니다. 혹시 관심이 있으시면 여기를 참고하세요. 그대로 따라하면 여러분도 여러분의 시리얼 통신 프로그램을 만들 수 있습니다.

컴터와 NT-ARS를 연결하여 통신하면, 옆의 그림에서 보듯이 숫자가 4개가 보이고 콤마로 분리되어 있습니다. 첫 숫자가 피치(X축값)이고 두번째 숫자가 롤(Y값)입니다. 그 뒤의 숫자는 각각 각속도가 됩니다. 적분하면 위치를 알수 있게 됩니다. 근데 제가 필요한 것은 피치각도롤각도입니다. 따라서 입력되어 들어온 문자열을 지금까지 배운 함수를 통해서 조작할 필요가 있습니다.

 

예를 들면...........

<0,-3,-13,50>에서 {"0","-3",~,~}으로 말입니다.

 

그럼 간단하게 예제를 짜 볼까요. 문자열을 위와 같은 형식으로 입력하면 피치각과 롤각을 각각 다른 텍스트 박스에 출력되게 하는 겁니다.

디자인은 이렇게 되겠네요. 입력을 위한 텍스트 박스가 하나 필요하고, 출력을 위한 것이 2개 필요하니까 총 3개의 텍스트 박스가 필요하고, 버튼이 하나, 그리고 적당한 갯수의 라벨이 필요합니다. 해보죠.....

 

 

되는군요.....제가 얼마나 감격스러운지 모르실겁니다......진짜 되네요. 이제 이 예제를 통신 예제와 결합시키면 프로젝트의 반이상이 완성되는 겁니다. 나중에 그래픽적 요소가 필요하지만요.....문자열처리 함수를 정리하면 다음과 같습니다. MSDN의 내용입니다.

 

 

감격을 안고 다음 강좌로 넘어 갑니다.

 

String 클래스를 사용한 문자열 조작/처리는 중급강좌 4를 참고하세요.

 

 

  1. American Standard Code for Information Interchange [본문으로]
출처 : 프로젝트 수행 일지 : 초보 탈출기
글쓴이 : 신현기 원글보기
메모 :