Reputation: 43
I have a long string like this
dim LongString as String = "123abc456def789ghi"
And I want to split it into a string array. Each element of the array should be in 3 characters length
For example,
Dim LongArray(5) As String
LongArray(0) = "123"
LongArray(1) = "abc"
LongArray(2) = "456"
LongArray(3) = "def"
LongArray(4) = "789"
LongArray(5) = "ghi"
How do I split it using VB.net code?
Upvotes: 4
Views: 24466
Reputation: 1
This is my solution:
Function splitN(str As String, n As Integer) As String()
For i = 0 To Len(str) Step n + 1
Try
str = str.Insert(i + n, "|")
Catch
End Try
Next
Return str.Split("|")
End Function
You can call it like: splitN("abc123def456frg987ef", 3)
Upvotes: 0
Reputation: 2022
I have added some more logic to @jon code. This will work perfectly for the string which has length less than length passed.
Public Shared Function SplitByLength(ByVal [text] As String, ByVal length As Integer) As String()
Dim stringLength = text.Length
Dim arrLength As Integer = ([text].Length \ length) - 1 + IIf(([text].Length
Mod length) > 0, 1, 0)
Dim strArray As String() = New String(arrLength) {}
Dim returnString As String = ""
Dim i As Integer
Dim remLength As Integer = 0
For i = 0 To strArray.Length - 1
remLength = stringLength - i * length
If remLength < length Then
strArray(i) = [text].Substring((i * length), remLength)
Else
strArray(i) = [text].Substring((i * length), length)
End If
Next i
Return strArray
END FUNCTION
Upvotes: 0
Reputation: 1
Last array is missing:
Public Function SplitByLength(ByVal text As String, _
ByVal length As Integer) As String()
' Argument validation elided
Dim strArray As String() = New String((text.Length \ length) - 1) {}
Dim i As Integer
For i = 0 To text.Length - 1
strArray(i) = text.Substring((i * length), length)
Next i
' Get last array:
ReDim Preserve strArray(i)
strArray(i) = text.Substring(i * length)
Return strArray
End Function
Upvotes: 0
Reputation: 53
I'm splitting the string by 35.
var tempstore ="12345678901234567890123456789012345";
for (int k = 0; k < tempstore.Length; k += 35) {
PMSIMTRequest.Append(tempstore.Substring(k,
tempstore.Length - k > 35 ? 35 : tempstore.Length - k));
PMSIMTRequest.Append(System.Environment.NewLine);
}
messagebox.Show(PMSIMTRequest.tostring());
Upvotes: 1
Reputation: 1500525
This C# code should work:
public static string[] SplitByLength(string text, int length)
{
// According to your comments these checks aren't necessary, but
// I think they're good practice...
if (text == null)
{
throw new ArgumentNullException("text");
}
if (length <= 0)
{
throw new ArgumentOutOfRangeException("length");
}
if (text.Length % length != 0)
{
throw new ArgumentException
("Text length is not a multiple of the split length");
}
string[] ret = new string[text.Length / length];
for (int i = 0; i < ret.Length; i++)
{
ret[i] = text.Substring(i * length, length);
}
return ret;
}
Reflector converts that to VB as:
Public Shared Function SplitByLength(ByVal [text] As String, _
ByVal length As Integer) As String()
' Argument validation elided
Dim strArray As String() = New String(([text].Length \ length) - 1) {}
Dim i As Integer
For i = 0 To ret.Length - 1
strArray(i) = [text].Substring((i * length), length)
Next i
Return strArray
End Function
It's possible that that isn't idiomatic VB, which is why I've included the C# as well.
Upvotes: 2
Reputation: 111860
Dim LongString As String = "1234567"
Dim LongArray((LongString.Length + 2) \ 3 - 1) As String
For i As Integer = 0 To LongString.Length - 1 Step 3
LongArray(i \ 3) = IF (i + 3 < LongString.Length, LongString.Substring(i, 3), LongString.Substring(i, LongString.Length - i))
Next
For Each s As String In LongArray
Console.WriteLine(s)
Next
There are some interesting parts, the use of the \
integer division (that is always rounded down), the fact that in VB.NET you have to tell to DIM the maximum element of the array (so the length of the array is +1) (this is funny only for C# programmers) (and it's solved by the -1 in the dim), the "+ 2" addition (I need to round UP the division by 3, so I simply add 2 to the dividend, I could have used a ternary operator and the modulus, and in the first test I did it), and the use of the ternary operator IF() in getting the substring.
Upvotes: 0
Reputation: 2351
You could use LINQ like so:
' VB.NET
Dim str = "123abc456def789ghij"
Dim len = 3
Dim arr = Enumerable.Range(0, str.Length / len).Select (Function(x) str.Substring(x * len, len)).ToArray()
// C#
var str = "123abc456def789ghij";
var len = 3;
var arr = Enumerable.Range(0, str.Length / len).Select (x => str.Substring(x * len, len)).ToArray();
Note this will only take complete occurrences of length (i.e. 3 sets in a string 10 characters long).
Upvotes: 5
Reputation: 5029
This could work.
Module Module1
Sub Main()
Dim LongString As String = "123abc456def789ghi"
Dim longlist As New List(Of String)
For i As Integer = 0 To Convert.ToInt32(LongString.Length / 3) - 1
longlist.Add(LongString.Substring(i * 3, 3))
Next
For Each s As String In longlist
Console.WriteLine(s)
Next
Console.ReadLine()
End Sub
End Module
And this should work in .Net 1.1
Module Module1
Sub Main()
Dim LongString As String = "123abc456def789ghi"
Dim longlist(Convert.ToInt32(LongString.Length / 3) - 1) As String
For i As Integer = 0 To Convert.ToInt32(LongString.Length / 3) - 1
longlist(i) = (LongString.Substring(i * 3, 3))
Next
For i As Integer = 0 To Convert.ToInt32(LongString.Length / 3) - 1
Console.WriteLine(longlist(i))
Next
Console.ReadLine()
End Sub
End Module
Upvotes: 2