ASP에서 join과 split을 이용한 문자열 파싱(parsing) 


 저자: Daniel Joe |  날짜: 2001년 08월 17일    


join과 split는 문자열을 파싱(parsing)함에 있어 매우 유용한 함수들이다. 같단히 설명하자면, join은 하나의 일차원 배열의 내용을 하나의 문자열로 만드는 함수이고, split은 하나의 문자열 내용을 하나의 일차원 배열로 나누어 담는 함수이다.

join에 대한 문법은 다음과 같다:


join(list[, delimiter]) 


여기서 list는 문자열로 연결시킬 내용들이 들어 있는 배열을 나타낸다. Delimeter는 배열에 있는 요소들로부터 문자열을 만들 때 각 요소 사이에 들어갈 문자열을 의미한다. 이 값은 옵션으로 이것을 지정하지 않으면 내부적으로 빈 문자열(" ")로 처리된다. 이제 간단한 예를 한 번 살펴 보도록 하자.


Dim OneDimArray(5)
OneDimArray(0) = "Hello,"
OneDimArray(1) = "my"
OneDimArray(2) = "name"
OneDimArray(3) = "is"
OneDimArray(4) = "Daniel!"

Dim strSentence
strSentence = join(OneDimArray) 


위의 코드는 strSentence에 "Hello, my name is Daniel!"을 저장하게 된다. 만일 strSentence = join(OneDimArray) 부분을 strSentence = join(OneDimArray, ",") 부분으로 변경하면 strSentence에는 "Hello,,my,name,is,Daniel!"이 저장된다. 즉, 디리미터(delimeter, 구분자)는 앞의 경우 디폴트인 " " 이고, 후자의 경우는 ","인 것이다. 만일 배열의 각 요소를 하나의 문자열로 만들 때 각 요소 사이의 구분자가 없이 붙이고 싶을 경우는 단순히 strSentence = join(OneDimArray, "")라고 해주면 된다. 그 결과는 "Hello,mynameisDaniel!"이 될 것이다.


split은 join의 반대 결과를 만든다. split은 문자열을 취하여 문자열의 각 요소들을 적절한 기준으로 잘라 내 일차원 배열로 담아낸다. split의 문법은 다음과 같다:


split(String Expression[, delimiter[, count[, compare]]]) 


여기서 반드시 필요한 파라미터는 배열로 담을 문자열, Expression이다. Delimeter는 join과 마찬가지로 옵션이다. 디폴트는 " " 이다. count는 결과로 반환할 부분 문자열의 갯수이다. compare는 부분 문자열을 비교하는 방법을 결정한다. 이제 간단한 예를 한 번 살펴 보도록 하자.


Dim strSentence
strSentence = "Hello, my name is Daniel!"

Dim OneDimArray
OneDimArray = split(strSentence)
 


위의 코드는 strSentence에 담겨 있는 문자열을 OneDimArray란 일차원 배열의 각 요소에 "Hello,", "my", "name", "is", "Daniel!"을 저장한다. 만일 OneDimArray 배열에 3 요소만 저장하고 싶은 경우 count 파라미터를 이용하여 부분 문자열의 갯수를 정해주면 된다. 즉, OneDimArray = split(strSentence) 부분을 OneDimArray = split(strSentence, " ", 3)으로 변경시켜주면 된다. 이 결과는 "Hello,", "my", "name is Daniel!"이 된다. 만일 구분자로 컴마(,)를 사용하고 싶다면 OneDimArray = split(strSentence) 부분을 OneDimArray = split(strSentence, ",")로 변경시켜주면 된다. 이 결과는 "Hello", "my name is Daniel!"이 될 것이다.

앞에서도 언급했지만 join과 split은 서로 반대 관계이다. 예를 들어, 다음과 같은 코드를 보자.


Dim strSentence, strCopy
strSentence = "Hello, my name is Bob!"
strCopy = join(split(strSentence)) 


위의 코드에서 strCopy와 strSentence는 동일한 값을 갖는다.

지금까지 join과 split의 사용 방법에 대해 알아 보았다. 그렇다면 이 함수들은 언제 유용하게 사용될 수 있을까? 사실 ASP에서 문자열을 조작함에 있어 join과 split의 사용은 필수적이다. 하나의 예를 들기 위해 지난 시간에 살펴보았던 "AdRotator를 이용하여 배너 광고 로테이션 시키는 방법"에서 사용한 AdRotator.txt 파일을 살펴 보도록 하자. 그 파일에는 다음과 같은 형식의 데이터들이 저장되어 있다:


Advertiser Name
Advertiser URL
Advertiser Category
Banner ID
Comment
*
Advertiser Name
Advertiser URL
Advertiser Category
Banner ID
Comment
*
Advertiser Name
Advertiser URL
Advertiser Category
Banner ID
Comment
*

... 


이런 텍스트 파일을 이용하여 작업을 할 때 제일 먼저 하는 일은 FileSystemObject 객체를 이용하여 전체 텍스트 내용을 하나의 문자열로 읽어 들이는 것이다. 그 문자열을 str이란 변수로 담았다고 한다면 다음으로 할 일은 recArray = split(str, "*")을 해주는 것이다.

이렇게 함으로써 하나의 레코드 단위를 배열의 각 요소로 저장할 수가 있다. 마지막으로 레코드에 있는 각각의 요소를 얻으려면 elementArray = split(recArray(i), chr(13))이라고 해주면 된다. 여기서 chr(13)은 라인이 분리되어 있는 값을 의미한다.

이런 과정을 거침으로써 텍스트 파일의 내용을 적절히 파싱(parsing)을 할 수 있게 된다.

2008/02/21 15:49 2008/02/21 15:49

ASP로 개발작업을 할때 db연결 부분이나 공통으로 필요한 부분은 따로 파일로 작성해서
필요시 포함해서 쓰는 경우가 많습니다.

첫번째는 #include 를 이용한 방법이고 두번째는 Server.Execute를 이용한 방법입니다.
근데 이 두가지 방법이 외부파일을 포함해서 쓰는 공통의 방법이면서 몇가지 차이점이 있습니다.

 

차이점
1) #include는 IIS에서 ASP 파일을 실행하기 이전에 먼저 처리하지만 Server.Execute는 ASP 파일 실행시 같이 처리하게  됩니다.

   두문장이 삽입되는 생김새만 봐도 눈치챌수 있습니다.
2) #include는 삽입되는 파일과 삽입하는 파일의 변수가 공유가 되지만 Server.Execute는 변수 공유가 되지 않습니다.
   이부분은 아래 예제를 보면 이해가 가실겁니다.


예제1) Test.ASP파일의 내용이 다음과 같다고 할때
<% moneyValue = 100%>



#include로 test.asp를 포함시킨  moneyValue의 값은 100이 출력됩니다.
<%

  moneyValue = "10000"

%>
<!--#include file="test.asp"-->
<%
 
  Response.Write moneyValue
 
%>



Server.Execute로 test.asp를 포함시킨 moneyValue의 값은 Test.asp파일의 내용을 무시하고 그냥 100이 출력됩니다.

<%

  moneyValue = "10000"


  Server.Execute("Test.asp")
 
  Response.Write moneyValue
 
%>


그래도 Server.Execute문을 써야할때가 있습니다. 파일을 동적으로 삽입시켜야 할때입니다.
위에서 보셨듯이 #include는 asp구문이 끝난다음 삽입됩니다. html의 주석처리 이후에 #include문을
쓰기 때문에 <!--#include file=<%Thema%>--> 이런식으로 쓸수가 없습니다.

하지만 Server.Execute는 특정변수에다 조건에 따라서 삽입되는 파일경로를 달리하여
다음과 같이 쓸수 있습니다.
<%
 if chkThema = 1 then
   Thema = "event.asp"
 else
   Thema = "nomal.asp"
 end fif

 Server.Execute(Thema)
%>

2008/02/21 15:49 2008/02/21 15:49

= FormatDateTime 함수 =

FormatDateTime(Date[,NamedFormat])

Date : 필수적인 인수. 날짜식을 지정합니다
NamedFormat : 선택적인 인수로써 날짜/시간 형식을 나타내는 숫자 값입니다.

이 인수를 생략하면 vbGeneralDate를 사용합니다.

상수 설명
vbGeneralDate 0 날짜 또는 시간을 표시합니다. 날짜 부분이 있으면 간단하게 표시 날짜 형식으로 날짜를 표시하며, 시간 부분이 있으면 자세하게 표시 시간 형식으로 시간을 표시합니다. 날짜와 시간이 같이 있으면 두 부분을 모두 표시합니다.
vbLongDate 1 컴퓨터의 국가별 설정에서 지정한 자세하게 표시 날짜 형식으로 날짜를 표시합니다.
vbShortDate 2 컴퓨터의 국가별 설정에서 지정한 간단하게 표시 날짜 형식으로 날짜를 표시합니다
vbLongTime 3 컴퓨터의 국가별 설정에서 지정한 시간 형식으로 시간을 표시합니다
vbShortTime 4 24시간 형식(hh:mm)의 시간을 표시합니다.


- 예제 -

<%
Response.Write FormatDateTime(Now, 0) & "<BR>"
Response.Write FormatDateTime(Now, 1) & "<BR>"
Response.Write FormatDateTime(Now, 2) & "<BR>"
Response.Write FormatDateTime(Now, 3) & "<BR>"
Response.Write FormatDateTime(Now, 4) & "<BR>"
%>

2008/02/21 15:48 2008/02/21 15:48

<!-- Formatnumber, Formatcurrency 함수를 이용한 천단위 콤마찍기 짧막한 예제입니다.

       혹시 모르시는 분들 있을까봐 올립니다. -->


<%


   Dim moneyValue
   moneyValue = "100000"


   If IsNumeric(moneyValue) then 'moneyValue의 값이 숫자인지 아닌지 IsNumeric 함수를 이용해서 체크합니다
   response.write(formatnumber( moneyValue, 0 )) '0은 소숫점 자리수의 의미, Default가 2라서 소수점 자리를
   response.Write "<br><br>"                              '나타내고 싶지 않으면 0을 써주세요
   end if      

                                 

   If IsNumeric(moneyValue) then
   response.Write(formatcurrency( moneyValue, 0 )) '0은 소숫점 자리수의 의미, Default가 0이라서 생략가능
   end if


%>

2008/02/21 15:48 2008/02/21 15:48