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