2

我正在尝试在 VB.net 中编写一个程序,它将一些值输出到文本文件中。请耐心等待我,因为我对 VB.net 很陌生。

到目前为止我所拥有的如下:

Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    Dim str As String
    For Each File As String In System.IO.Directory.GetFiles(TextBox1.Text)
        str = str & File & "|" & System.IO.Path.GetFileNameWithoutExtension(File).Split("-")(0).Trim & "|" & System.IO.Path.GetFileNameWithoutExtension(File).Split("-")(0).Trim & "||" & DateTimePicker1.Text & "|" & Environment.NewLine
    Next

    System.IO.File.WriteAllText("C:\output\output.txt", str)

End Sub

单击 button3 时输出文件(output.txt)的结果如下:

C:\DirectoryTest\Clients\2356851-Kathy Winkler - Family Investments.pdf|2356851|2356851||04/10/2013|

C:\DirectoryTest\Clients\58736 -Katrina Armon - Sandlewood Homes Co.pdf|58736|58736||04/10/2013|

C:\DirectoryTest\Clients\Karen Cooper - 001548 - Famtime.pdf|Karen Cooper|Karen Cooper||04/10/2013|

到目前为止,我的代码完全符合我的要求,唯一的事情是我想让代码更智能,但不知道如何做。更聪明的是有没有办法让下面的代码只提取文件名中看到的 5 到 10 位数的帐号,如果文件名中不存在帐号以显示消息框?

System.IO.Path.GetFileNameWithoutExtension(File).Split("-")(0).Trim & "|" & System.IO.Path.GetFileNameWithoutExtension(File).Split("-")(0).Trim

从输出的最后一行可以看出……</p>

C:\DirectoryTest\Clients\Karen Cooper - 001548 - Famtime.pdf|Karen Cooper|Karen Cooper||04/10/2013|

…客户名称“Karen Cooper”显示在应显示帐号的两个区域中。这就是为什么我需要让这段代码更智能,让它在文件名中搜索一个 5 到 10 位数字的帐号,以便在文件名之后显示它,如其他 2 个示例所示。

请让我知道这是否可能。如果您有任何问题,请告诉我。

4

4 回答 4

1

这是您的一些简单逻辑....当然,您可以先执行诸如查找文件名之类的操作,但是就可以了

    Dim returnval As String = ""
    Dim s As String = "C:\DirectoryTest\Clients\Karen Cooper - 001548 - Famtime.pdf|Karen Cooper|Karen Cooper||04/10/2013|"
    For Each p As String In s

        If IsNumeric(p) Then
            returnval += p
        Else
            'MsgBox("no")
        End If
    Next

msgbox(returnval) 将保存你所有的数字 5-10 ,取决于你想从这里得到的具体程度

拆分文件名

 'This will extract and return the filename from the specified path and filename.
 '
 Dim filePath As String = "c:\MyDirectory\MYFile.txt"
 Dim slashPosition As Integer = filePath.LastIndexOf("\")
 Dim filenameOnly As String = filePAth.Substring(slashPosition + 1)

 MsgBox(filenameOnly)

 *FOUND AT LINK http://www.vbforfree.com/274/extract-and-retrieve-the-filename-from-a-path/*

然后从那里尽可能多地操作你的字符串

于 2013-04-30T17:10:53.417 回答
0

你的文件名呢?

C:\DirectoryTest\Clients\Karen Cooper - 001548 - Famtime.pdf

平心而论,应该是

C:\DirectoryTest\Clients\001548 - Karen Cooper - Famtime.pdf
于 2013-04-29T15:51:04.797 回答
0

你应该试试这个。我还没有机会测试它,但它应该可以工作

Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    Dim str As String
    For Each File As String In System.IO.Directory.GetFiles(TextBox1.Text)
        Dim strs as String() = System.IO.Path.GetFileNameWithoutExtension(File).Split("-")
        Dim AccountNum as int = 0
        For each section in strs()
            ' Loop through each section separated by - and try to cast it to an int
             ' you may want to use cLong instead
            Try
               AccountNum = cInt(section.trim())
               exit for
            Catch
            End Try
        Next
      ' DO LOGIC HERE TO BUILD OUTPUT with the account num now known
    Next

    System.IO.File.WriteAllText("C:\output\output.txt", str)

End Sub
于 2013-04-29T18:16:41.760 回答
0

我建议使用 RegEx 来提取帐号。使用 RegEx 的一个附带好处是您可以将 RegEx 模式存储在代码之外,例如在配置文件中,因此如果您需要修改模式,您可以轻松地完成此操作而无需重新编译您的应用程序。

Function GetAccountNumber(fileName As String) As String
    Dim pattern As String = ".*?(?<acct>\d{5,10}).*?"
    Dim regEx As New Regex(pattern)
    Dim match As Match = regEx.Match(fileName)
    Dim accountNumber As String = Nothing
    If match.Success Then
        Dim group As Group = match.Groups("acct")
        If group.Success Then
            accountNumber = group.Value
        End If
    End If
    Return accountNumber
End Function

在上面的示例中,我使用以下 RegEx 模式来查找字符串中的五到十位数字:

.*?(?<acct>\d{5,10}).*?

模式的.*?开头和结尾表示任意字符,任意次数。问号表示它是非贪婪的。换句话说,它只匹配必要的字符数。通过使其不贪婪,它不会窃取帐号中的任何数字。

括号围绕着我们要查找的字符串部分(帐号)。括号组的?<acct>开头是一个名称,我们可以通过它来引用它。在这种情况下,我将组命名为acct\d表示任何数字字符。该{5,10}手段重复五到十次。

于 2013-04-29T20:15:14.527 回答