繁体   English   中英

VB.NET字符串预先分割(C#或VB.NET)

[英]VB.NET String split in advance (C# or VB.NET)

这是我要拆分的文本行,data.txt(一些文本文件)

AAEJEY CONSUMER COMPANY                    61469 HH13811 4796000501758   NILMA LIQUID BLUE                240 75ML         960.00  20131002
EVERGREEN MARKETING                        61485 PC21946 3014260818685   ORALB 7 BENEFITS T/BRUSH          12 EACH         120.00  20131002
HARISCHANDRA MILLS PLC                     61488 BV50201 4792083040122   HARISCHANDRA COFFEE               40 50GR        4000.00  20131002

在“ COMPANY”和“ 61469”之间,行长度可能会有所不同。 我想按以下方式拆分该行。

AAEJEY消费者公司

61469

HH13811

4796000501758

尼玛液体蓝

240

75ML

960.00

20131002

这是我的代码,它全部用空格分开,但是我不能将公司名称(AAEJEY CONSUMER COMPANY)作为一个单一名称或将项目名称(NILMA LIQUID BLUE)作为一个单一名称。

Dim myArray() As String, delimiter As Char = " "
        Dim strBuild As String = ""
        Dim b As Boolean = False
        Dim i As Integer = 0
        Try
            Using sr As New StreamReader(fileName)
                Dim line As String
                While Not sr.EndOfStream
                    line = sr.ReadLine()
                    Console.WriteLine(line)
                    myArray = line.Split(delimiter)
                    Dim order As New OrdData()
                    For index As Integer = 0 To myArray.Length - 1
                        If myArray(index) = "" Then
                            i = index
                            myArray.Skip(1)                                
                        Else                               
                            strBuild += myArray(index) + " "
                            Console.WriteLine(strBuild)
                        End If

                    Next
                End While
            End Using
        Catch e As Exception
            Console.WriteLine("The file could not be read:")
            Console.WriteLine(e.Message)
        End Try

看起来您具有固定长度的文件格式,因此实际上应该按字符数进行操作,例如

line = sr.ReadLine()
var name = line.Substring(0, 43).Trim();
var number = line.Substring(44, 5).Trim();

您的文件没有任何定界符。 您不能使用空格,因为空格是项目的一部分(第一列)。

您可以尝试这种方便的功能方法。

首先定义一个函数以递归方式分割一条线:

Dim f As Func(Of String, IEnumerable(Of Integer), IEnumerable(Of String)) = Nothing
f = Function(t, ns)
    If ns.Any() Then
        Dim n = ns.First()
        Dim i = System.Math.Min(n, t.Length)
        Dim t0 = t.Substring(0, i)
        Dim t1 = t.Substring(i)
        Return New List(Of String) From { t0.Trim() }.Concat(f(t1, ns.Skip(1)))
    Else
        Return New List(Of String) From { t.Trim() }
    End If
End Function

然后像这样定义拆分:

Dim splits = { 43, 6, 8, 16, 31, 6, 10, 11 }

现在您可以像这样运行它:

Dim fields = f(line, splits).ToArray()

根据您的第一行数据,我得到了以下结果:

结果

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM