【问题标题】:VB Parse a text file, match column 1 to a variable, pass column 2 to another variableVB 解析一个文本文件,将第 1 列匹配到一个变量,将第 2 列传递给另一个变量
【发布时间】:2017-04-26 13:57:17
【问题描述】:

我编写了一个脚本,该脚本将从程序中取出一个表格,并将其以 逗号分隔 文本文件的形式导出到本地驱动器。我需要的是一个脚本来读取文本文件。用户将从 Public Class Form 1 的文本框中输入一个字符串,然后将该字符串传递给 Public Class SpaceMenuClass 中的另一个 Sub。切换看起来不错,但我不知道如何解析文本文件(将第 1 列与字符串匹配,并存储该行中的第 2 列以传回SpacemenuClass)。我知道这可能看起来模棱两可,但希望有一定的意义。提前感谢任何人。

来自 Form1 类

Private Sub BtnPlano_Click_(sender As Object, e As EventArgs) Handles BtnPlano.Click
    If TxtBoxPlano.Text <> "" Then
        SpaceCommands.SearchPlano(TxtBoxPlano.Text)
    Else MessageBox.Show("Please Enter a Valid Planogram Name!")

    End If
    TxtBoxPlano.Clear()

End Sub

来自 SpaceMenuClass:

Public Sub SearchPlano(PlanoName As String)
    For Each Plano As Space.Planogram In SpacePlanning.ForPlanograms()
        SpacePlanning.SetActivePlanogram(Plano.Number - 1)
        'Go open the Searchplano table on the shared drive
        SpacePlanning.OpenTableChartView(AnalysisFileName:="\\SERVER1\JDA\Tables\SearchPlano.pst")
        'Export the table to a Tab Delimited Text file
        SpacePlanning.ExportTableData(ExportFileName:="C:\Temp\JDA\SearchPlano.txt", ExportMethod:=ExportMethod.CommaSeparated, UseCurrency:=False, UseQuotedStrings:=False, UseThousandsSeparator:=False)
        'Close the Table
        SpacePlanning.CloseTableChartView(AnalysisFileName:="\\SERVER1\JDA\Tables\SearchPlano.pst")
        ' Open the text file and parse it
        Dim str As System.IO.StreamReader = New System.IO.StreamReader(New System.IO.FileStream("C:\Temp\JDA\SearchPlano.txt", System.IO.FileMode.Open))
        Dim strline, arr(), Name, Nbr As String
        Try
 NextLine:
            strline = str.ReadLine
            arr = strline.Split(",")
            Name = arr(0)
            Nbr = arr(1)
            If Name = PlanoName Then
                SpacePlanning.SetActivePlanogram(Plano.Number = Nbr)
                GoTo Finish
            Else
                GoTo NextLine
            End If
        Catch
        End Try
    Next
Finish:
    My.Computer.FileSystem.DeleteFile("C:\Temp\JDA\SearchPlano.Txt")
End Sub

【问题讨论】:

  • 你现在拥有的东西出了什么问题?你得到什么错误或异常?
  • 抱歉,该信息会有所帮助。我得到一个迅速消失的 cmd 弹出窗口。我可以添加一行让它留在屏幕上吗?
  • 我什至不能从发布的代码中确定 cmd 弹出窗口的来源——它可能来自您在 SpacePlanning 中调用的内容之一。这并不一定表明有任何问题。您是否遇到异常,或者是否有其他类型的输出不是您所期望的?
  • 总而言之,该表超出了 JDA Space Planning 的范围,它是类别顾问用来帮助为零售商绘制货架的。货架图文件包含多个货架图(或货架图),其中包含名称和编号以及其他元数据。我正在使用 Space Automation Pro,它基于 VB,带有使用其语言的 JDA 插件,它将与 Space Planning 对话。我希望程序要求用户在文本文件的第 1 列中输入货架图名称,然后跳转到第 2 列中的货架图编号。您不能按其名称跳转到货架图,只能跳到编号。它只是停留在#1
  • 如果您将catch 更改为catch ex as exception 并执行一些操作来观察(断点)或记录异常,您可能会发现它更有帮助。您当前的异常处理程序是一种反模式,可能会阻止您看到问题。

标签: vb.net


【解决方案1】:

您打开文件进行阅读,然后在关闭之前尝试将其删除。这会引发异常。为避免这种情况,请将 StreamReader 包装在 Using 块中。 End Using 自动处理对象(为您关闭文件)。

Public Sub SearchPlano(planoName As String)
    For Each plano As Space.Planogram In SpacePlanning.ForPlanograms()
        SpacePlanning.SetActivePlanogram(plano.Number - 1)
        'Go open the Searchplano table on the shared drive
        SpacePlanning.OpenTableChartView(AnalysisFileName:="\\SERVER1\JDA\Tables\SearchPlano.pst")
        'Export the table to a Tab Delimited Text file
        SpacePlanning.ExportTableData(
            ExportFileName:="C:\Temp\JDA\SearchPlano.txt", ExportMethod:=ExportMethod.CommaSeparated,
            UseCurrency:=False, UseQuotedStrings:=False, UseThousandsSeparator:=False)
        'Close the Table
        SpacePlanning.CloseTableChartView(AnalysisFileName:="\\SERVER1\JDA\Tables\SearchPlano.pst")
        ' Open the text file and parse it
        Using str = New System.IO.StreamReader("C:\Temp\JDA\SearchPlano.txt")
            Dim arr(), name, nbr As String
            Do
                If str.EndOfStream Then
                    ' didn't find item!!!
                End If
                arr = str.ReadLine.Split(",")
                name = arr(0)
                nbr = arr(1)
            Loop Until name = planoName
            SpacePlanning.SetActivePlanogram(plano.Number = nbr)
        End Using
    Next
    My.Computer.FileSystem.DeleteFile("C:\Temp\JDA\SearchPlano.Txt")
End Sub

我还清理了您的循环并添加了对EndOfStream 的检查,以防您找不到匹配项(这也会引发异常)。

另外,将 StreamReader 更改为只打开文件。你有一个嵌套的 FileStream 对象,这需要另一个 Using 块,并且是不必要的。

【讨论】:

  • Djv,我实际上只是沿着你昨天提到的那条路走下去。我将 Spaceplanning 命令放在 For Each 命令之上,它的运行速度快了很多!但是,当我复制您的建议时,它永远不会将名称与平面名称匹配。我在 Loop Until 语句之后添加了一个 Messagebox.show(name),发现对于 Do Loop 的每次迭代,name 字符串总是包含相同的值,就像它没有跳到文本文件中的下一行一样在 Planoname 上匹配。那有意义吗?我也要附上txt文件。
  • 这将是文本文件的一个示例。姓名,编号 AAAAAAA,46 BBBBBBBB,47 CCCCCCCC,21 DDDDDDDD,42 EEEEEEEE,41 FFFFFFFF,43 GGGGGGGG,45 HHHHHHHH,44 IIIIIIIII,7
  • 我的一个同事和我想通了。我们需要退出 For 循环,因为它与应有的完美匹配,但会离开并遍历文件中的下一个货架图。这是因为我无法表达清楚。话虽如此,多亏了您和其他所有提供帮助的人,您仍然能够将我送达 90%。
  • @KevinG 好的,太好了。
猜你喜欢
  • 2015-05-22
  • 2021-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-01
  • 2011-03-15
  • 1970-01-01
相关资源
最近更新 更多