【问题标题】:VB.NET String split in advance (C# or VB.NET)VB.NET 字符串预先拆分(C# 或 VB.NET)
【发布时间】:2013-10-30 01:45:43
【问题描述】:

这是我要拆分的文本行,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

【问题讨论】:

  • 数据的格式是否总是如此一致?如果是这样,您可能希望为每一列获取修剪后的子字符串
  • 是的。数据格式始终一致。但有时名称有 3 部分或 4 部分或有时 2 部分,例如:DANISHT IMPEX 或 DANIHT IMPEX LIMITED 作为公司名称
  • 如果空格是您的分隔符,那么您的文档中一定不能有使用空格的部分,除非这些部分被“转义”(可能通过引号括起来)。但它确实看起来你有固定的列宽,所以请选择下面的答案。

标签: c# .net regex vb.net


【解决方案1】:

您可以尝试这种方便的函数式方法。

先定义一个函数递归分割一行:

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

根据你的第一行数据,我得到了这个结果:

【讨论】:

  • 您是正确的,但有时整数长度可能会有所不同......这就是问题所在。无论如何这都很好。
  • @Elshan - 我知道字符串的长度会有所不同,但是字段之间的字符数(包括空格)会有所不同吗?
【解决方案2】:

看起来你有一个固定长度的文件格式,所以你实际上应该按字符数,例如

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

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

【讨论】:

  • 但是下一个数字的开头(不确定是什么)总是在同一个位置?
  • 是的,但它仍在前 43 个字符之内(或任何计数)。如果您使用下面的代码(您可能需要调整数字),它将被视为一个。
  • 然后把它从左边一个字符开始。关键是,如果您没有任何分隔符,则必须依赖每列的 固定 宽度,并且无法更改这些宽度。您需要确定您可以获得的最大数量并为其提供足够的空间。
  • @Elshan 看起来您的数据在固定长度字段中,您只需要确定字段长度是多少。
  • @Szymon 您解决问题的方法很好。我认为第一次我们使用子字符串,然后我们可以在“空格”中拆分,然后再次子字符串项目代码。因为 char 值的实际长度不是整数。我会试试看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-13
  • 1970-01-01
相关资源
最近更新 更多