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]두 글자 이상의 문자열을 사용해서 Split 하기 (VB.NET, C#) (2) | 2006.03.25 |
[HowTo]Base64 인코딩, 디코딩 공통 함수(C#) (0) | 2006.03.11 |
[HowTo]파일에 문자열을 기록하는 코드(C#) (2) | 2006.03.11 |
[Article]Try-catch-finally 구조에서 return 문의 정확한 위치 (4) | 2006.03.05 |
댓글을 달아 주세요
좋은 정보 감사합니다.
2007.07.20 11:25 [ ADDR : EDIT/ DEL : REPLY ]몇 가지 암시적 변환 경고가 있습니다.
int16타입을 int32로 변경하거나 int32 타입이 16타입으로 대입될 때에 CType(변경할 타입,int16)으로 변경하시면 해결됩니다.
또한 리턴 값을 정의하지 않아 object형식으로 리턴을 받습니다.
Public Function SplitByString(ByVal splitString As String, ByVal delimeter As String) As String()
위와 같이 선언 하면 해결됩니다.
좋은 지적 감사합니다.^^ 이 글 작성때는 제가 C#을 쓰던 때라 VB.NET은 돌려보지도 않고 글을 썼던 것 같네요. 다시 한번 감사드립니다.
2007.07.29 16:57 신고 [ ADDR : EDIT/ DEL ]