C# & VB.NET2006. 3. 25. 13:43
Split은 아주 많이 쓰이는 메소드 중에 하나이다. 대부분 "," 등의 Delimeter를 써서 여러 개의 데이터를 문자열로 이어 붙여서 DB에 넣어 두고는, 그걸 꺼내서 쓸 때 split 메소드를 사용해서 배열로 다시 쪼개서 사용하게 된다.

그런데, 아주 간혹 Delimeter가 한 글자가 아닐 때도 있을 수 있다. 복잡한 문장을 분석하고 싶을 때가 그런 경우가 된다. 또는 두 글자 이상의 문자열을 Delimeter로 써야 할 때도 있을 수 있다. (예를 들면 이미 각 문자열들에 "," 등의 character들이 포함되어 있어서 한 글자로 Delimeter를 쓰기가 애매한 경우가 있다.)

어제 나도 그런 경우가 생겨서 역시 Google의 도움을 받아서 어떤 사람이 만들어 놓은 함수를 하나 구했다.

원본은 여기 - http://community.sgdotnet.org/blogs/triplez/archive/2005/04/24/14627.aspx


C#

private string[] SplitByString(string testString, string split) {
  int offset = 0;
  int index = 0;
  int[] offsets = new int[testString.Length + 1]; 

  while(index < testString.Length) {
    int indexOf = testString.IndexOf(split, index);
    if ( indexOf != -1 )  {
       offsets[offset++] = indexOf;
       index = (indexOf + split.Length);
    } else {
       index = testString.Length;
    }
  }

  string[] final = new string[offset+1];
  if (offset == 0 ) {
    final[0] = testString;
  } else {
    offset--;
    final[0] = testString.Substring(0, offsets[0]);
    for(int i = 0; i < offset; i++) {
       final[i + 1] = testString.Substring(offsets[i] + split.Length, offsets[i+1] - offsets[i] - split.Length);
    }
    final[offset + 1] = testString.Substring(offsets[offset] + split.Length);
  }
  return final;
}


VB.NET

Function SplitByString(ByVal splitString As String, ByVal delimeter As String)
  Dim offset As Int16
  Dim index As Int16
  Dim offsets(splitString.Length) As Integer

  While index < splitString.Length
      Dim indexOf As Int16
      indexOf = splitString.IndexOf(delimeter, index)
      If indexOf <> -1 Then
          offsets(offset) = indexOf
          offset = offset + 1
          index = (indexOf + delimeter.Length)
      Else
          index = splitString.Length
      End If
  End While

  Dim final(offset) As String
  If offset = 0 Then
      final(0) = splitString
  Else
      offset = offset - 2
      final(0) = splitString.Substring(0, offsets(0))
      Dim i As Int16
      For i = 0 To offset
          final(i + 1) = splitString.Substring(offsets(i) + delimeter.Length, offsets(i + 1) - offsets(i) - delimeter.Length)
      Next
      final(offset + 2) = splitString.Substring(offsets(offset + 1) + delimeter.Length)
  End If

  Return final
End Function



원작자의 페이지에는 C# 으로 된 함수 뿐이지만, 필요했던 것이 VB.NET이어서 VB.NET으로 고쳤다. 그런데 VB.NET으로는 코딩해본 적이 거의 없어서, 일단 잘 실행되는 것 까지는 봤는데 어떤 버그가 있을지는 잘 모르겠다..^^;; 혹시 이 블로그 들르시는 VB.NET 고수 분들이 있다면 가르침을 좀 주시길....ㅎㅎ (배열 부분이 C#이랑 좀 달라서 애를 좀 먹었다)
Posted by kkongchi

댓글을 달아 주세요

  1. jumarion

    좋은 정보 감사합니다.
    몇 가지 암시적 변환 경고가 있습니다.
    int16타입을 int32로 변경하거나 int32 타입이 16타입으로 대입될 때에 CType(변경할 타입,int16)으로 변경하시면 해결됩니다.
    또한 리턴 값을 정의하지 않아 object형식으로 리턴을 받습니다.
    Public Function SplitByString(ByVal splitString As String, ByVal delimeter As String) As String()
    위와 같이 선언 하면 해결됩니다.

    2007.07.20 11:25 [ ADDR : EDIT/ DEL : REPLY ]
    • 좋은 지적 감사합니다.^^ 이 글 작성때는 제가 C#을 쓰던 때라 VB.NET은 돌려보지도 않고 글을 썼던 것 같네요. 다시 한번 감사드립니다.

      2007.07.29 16:57 신고 [ ADDR : EDIT/ DEL ]