2014-10-07 62 views
0

我有一个树状图,其中树节点是从文本文件中生成的。标准布局将是: -在特定点分割文本字符串

JOBNAME - jobnumber可以 - jobtype(之间的空间“ - ”)

对于我需要将此字符串分割成3个部分的操作的一部分,该余“M使用LastIndexOf("-"c)和使用`Microsoft.VisualBasic.Mid”功能将它拆分出来

Private Sub Job_Select_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
tbJobName.Text = Main.tvProgress.SelectedNode.Text 

    Dim enUK As New CultureInfo("en-GB") 
    Dim ToCheck As String = tbJobName.Text 
    Dim index1 As Integer = ToCheck.LastIndexOf("-"c) 
    Dim jCode As String = Microsoft.VisualBasic.Trim(Microsoft.VisualBasic.Mid(ToCheck, index1 - 5, 5)) 
    Dim jOps As String = Microsoft.VisualBasic.Trim(Microsoft.VisualBasic.Mid(ToCheck, index1, 10)) 

我的问题是,当jobtype还包含一个 - 在文本,因为这则抛出所有的东西“”。我试着切换它周围使用IndexOf但是偶尔jobname将包含“ - ”

我没有对在作业名文本没有控制 - jobnumber可以 - jobtype

如何克服这个

任何想法

如果您需要任何更多的信息,然后我可以更新帖子....

回答

1

我假设你没有任何控制这些文件如何格式化,因为如果你这样做,它会是很多b只需将文件格式更改为XML或至少一种CSV文件格式即可。

如果在作业名称和类型中都有不定数量的破折号,那么只要该数字是常量,就可以使用正则表达式来查找组。它应该是这样的:

Dim name, number, type As String 
    Dim fileLine As String = "job - name - 1234 - job - type" 

    Dim regExp As New Regex("(?<name>.*)\s-\s(?<number>\d+)\s-\s(?<type>.*)") 
    Dim m As Match = regExp.Match(fileLine) 

    name = m.Groups("name").Value 
    number = m.Groups("number").Value 
    type = m.Groups("type").Value 

注:这仅在“工号”永远是一个作品数量。如果没有,您可能可以使用更复杂的正则表达式来匹配它。

+0

非常好,那正是我想要的 – elmonko 2014-10-07 20:20:08

0

如果作业名和jobnumber可以永远不会包含破折号,那么你可以使用级联IndexOfs,随着最后发现作为下一个的开始一。

Dim endOfJobName As Integer = ToCheck.IndexOf("-"c) 
If endOfJobName <> - 1 Then 
    ' Get jobname here if needed 
    Dim endOfJobNumber As Integer = ToCheck.IndexOf(endOfJobName, "-"c) 
    If endOfJobNumber <> -1 Then 
    ' Get jobnumber here if needed 

    ' The remainder of the string is jobtype 
    Dim jobType = ToCheck.SubString(endOfJobNumber + 1) 
    End If 

End If 

如果任JOBNAME或jobnumber可以可含有破折号,然而,不存在一个巨大的量,可以做,比在源改变定界符其他。

+0

感谢您的信息 – elmonko 2014-10-07 20:21:21

0

您不能使用Dim job As String() = Split(ToCheck, " - ")?注意短划线周围的空格。

Split

+0

谢谢,但你不能在“ - ”空间 – elmonko 2014-10-07 20:20:33

+0

@elmonko:谁说的?在我的测试中,以及我链接到状态的MSDN页面“__Delimiter:Optional。用于标识子字符串限制的任何字符串。如果省略了分隔符,则空格字符(”“)被假定为分隔符.__” – 2014-10-09 05:19:08

0

如果区段之间的分离器是空间划线空间然后可以使用的String.Split过载,其确定部件的最大数目,以它在拆分:

Dim s = "job-name - jobnumber - jobtype (with the spaces in between the "" - "")" 
Dim parts As String() = s.Split(New String() {" - "}, 3, StringSplitOptions.None) 
Console.WriteLine("name: " & parts(0).Trim()) 
Console.WriteLine("number: " & parts(1).Trim()) 
Console.WriteLine("type: " & parts(2).Trim()) 

输出:

name: job-name 
number: jobnumber 
type: jobtype (with the spaces in between the " - ") 
+0

感谢您的信息 – elmonko 2014-10-07 20:21:46