How to split a string into a fixed length string array?

旧巷老猫 提交于 2019-12-03 18:11:04

问题


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?


回答1:


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



回答2:


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).




回答3:


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.




回答4:


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());



回答5:


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.




回答6:


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



回答7:


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


来源:https://stackoverflow.com/questions/7376987/how-to-split-a-string-into-a-fixed-length-string-array

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!