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#이랑 좀 달라서 애를 좀 먹었다)
그런데, 아주 간혹 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#이랑 좀 달라서 애를 좀 먹었다)
'C# & VB.NET' 카테고리의 다른 글
[HowTo]Rijndael(AES) 암/복호화 코드(C#) (5) | 2006.03.28 |
---|---|
[HowTo]xml string을 DataSet으로 읽기(C#) (0) | 2006.03.28 |
[HowTo]Base64 인코딩, 디코딩 공통 함수(C#) (0) | 2006.03.11 |
[HowTo]파일에 문자열을 기록하는 코드(C#) (2) | 2006.03.11 |
[Article]Try-catch-finally 구조에서 return 문의 정확한 위치 (4) | 2006.03.05 |