如何在vb.net中的文本文件中读取重复的字符串

时间:2013-08-05 05:52:12

标签: vb.net

我希望这个程序打开一个文本文件并找到那些特定的字符,然后将其后的单词添加到列表中(每个字符在列表中都有特定的子项)。 如果没有重复,它可以很好地工作。但如果我有这样的清单:

    /* First row of the list */
#Alireza
%Human
&1
@$1200
$*1
*$1000
   /* ' Second row */
#Behzad
%Human
&1
@$1340
$*1
*$1000
   /* ' And third row */
#Samaneh
%Human
&1
@$1570
$*1
*$1230

然后它只添加第一行。我也做了一个while循环,但它只会将第一行添加到其他行。有没有人可以帮忙!(顺便说一句,我的清单包括6列)

这是代码:

   Public code As String
   Public cat As String
   Public stock As Integer
   Public price As Double
   Public sold As Double
   Public cost As Double
   Public i As Integer

Public Sub _Load(ByVal FileName As String)

    Dim strLines() As String
    Dim strLine As String


    Dim strData As String
    Dim objFileInfo As New FileInfo(FileName)

    strData = My.Computer.FileSystem.ReadAllText(FileName)

    strLines = strData.Split(New String() {ControlChars.CrLf}, StringSplitOptions.RemoveEmptyEntries)

        For Each strLine In strLines
            If strLine.StartsWith("#") Then
                code = strLine.Substring(1)

            End If
            strLine = Nothing
        Next

        For Each strLine In strLines
            If strLine.StartsWith("%") Then
                cat = strLine.Substring(1)
                Exit For
            End If
            strLine = Nothing
        Next

        For Each strLine In strLines
            If strLine.StartsWith("&") Then
                stock = strLine.Substring(1)
                Exit For
            End If
            strLine = Nothing
        Next

        For Each strLine In strLines
            If strLine.StartsWith("@$") Then
                price = strLine.Substring(2)
                Exit For
            End If
            strLine = Nothing
        Next

        For Each strLine In strLines
            If strLine.StartsWith("$*") Then
                sold = strLine.Substring(2)
                Exit For
            End If
            strLine = Nothing
        Next

        For Each strLine In strLines
            If strLine.StartsWith("*$") Then
                cost = strLine.Substring(2)
                Exit For
            End If
            strLine = Nothing
        Next
End Sub


Private Sub button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles toolImport.Click
    Dim ans As String



    OpenFileDialog1.Title = "What are you looking for?"
    OpenFileDialog1.InitialDirectory = Application.StartupPath
    OpenFileDialog1.Filter = "text Files (*.txt)|*.txt|Data Files (*.dat)|*.dat|All files (*.*)|*.*"
    OpenFileDialog1.FileName = "myList"
    Try
        If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
            Dim sr As StreamReader = New StreamReader(OpenFileDialog1.FileName)

            Do While sr.Peek > -1
                _Load(OpenFileDialog1.FileName)
                Dim list As New ListViewItem(code)
                list.SubItems.Add(cat)
                list.SubItems.Add(stock)
                list.SubItems.Add(price)
                list.SubItems.Add(sold)
                list.SubItems.Add(cost)
                listClothes.Items.Add(list)
                i += 1
                MessageBox.Show("Your list has been uploaded successfully", "ccc!", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Loop

        End If

    Catch ex As Exception
        MsgBox(ex.Message)
    End Try

End Sub

1 个答案:

答案 0 :(得分:2)

通过“重复字符串”,我认为你的意思是当文件中有多个项目(6列组)时如何读取文件。

您当前程序仅获取第一个项目的原因是因为您在找到给定子项目的第一个匹配项后退出For循环,无论文件中可能有多少个。

解决此问题的一种方法是将您的子_Load更改为一个函数并让它返回一个List(Of ListViewItem)对象,然后您可以迭代该对象并添加到主列表中{{1} })。我也会摆脱ListClothes,因为你不需要它来做你正在做的事情。您正在从StreamReader传递FileName属性(其中包含路径和扩展名),因此您只需在OpenFileDialog函数中使用该属性即可。

它看起来像这样:

_Load

上面的代码接受传入Public Function _Load(ByVal FileName As String) As List(Of ListViewItem) Dim Lines() As String Dim List(Of ListViewItem) StockList = New List(Of ListViewItem) Dim ListViewItem As StockItem Lines = File.ReadAllText(FileName).Split(New String() _ { ControlChars.CrLf}, StringSplitOptions.RemoveEmptyEntries) For j = 0 To Lines.Length - 1 Step 6 StockItem = New ListViewItem(Lines(j)) StockItem.SubItems.Add(Lines(j + 1)) StockItem.SubItems.Add(Lines(J + 2)) StockItem.SubItems.Add(Lines(j + 3)) StockItem.SubItems.Add(Lines(J + 4)) StockItem.SubItems.Add(Lines(j + 5)) StockList.Add(StockItem) Next Return StockList End Function ,对从FileName返回的字符串进行拆分并删除空条目。

接下来,它循环遍历代码,一次6行。在循环中,创建一个新的ListViewItem,并填充子项,然后将此ListViewItem添加到ReadAllText

然后返回填充的List(Of ListViewItem)

StockList事件中,您可以像这样使用它:

button1_Click

在此代码中,您将选定的Private Sub button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles toolImport.Click Dim ans As String Dim stockItems As List(Of ListViewItem) OpenFileDialog1.Title = "What are you looking for?" OpenFileDialog1.InitialDirectory = Application.StartupPath OpenFileDialog1.Filter = "text Files (*.txt)|*.txt|Data Files (*.dat)|*.dat|All files (*.*)|*.*" OpenFileDialog1.FileName = "myList" Try If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then stockItems = _Load(OpenFileDialog1.FileName) For Each (stockItem As ListViewItem in stockItems) listClothes.Add(stockItem) Next MessageBox.Show("Your list has been uploaded successfully", "ccc!", MessageBoxButtons.OK, MessageBoxIcon.Information) End If Catch ex As Exception MsgBox(ex.Message) End Try End Sub 传递给FileName方法,并将其返回值分配给本地_Load变量。

然后,您遍历stockItems列表,并将其中的每个stockItems添加到ListViewItem

注意此代码很脆弱 - 如果输入文件中的列顺序不正确,或者缺少列,则数据将会偏斜,并且如果您尝试读取不存在的数组(来自文件)中的行,则程序可能会崩溃。当然,您也可以将该代码包装在Try Catch块中。

这只是一种方法 - 我毫不怀疑还有其他方法。但这至少应该让你朝着正确的方向前进。

修改 删除前导字符的最简单方法是将它们添加到拆分中,如下所示:

clothesList

这将返回所有行的数组,减去空行和前导字符。

当然,使用上面的代码,您实际上不再需要那些前导字符,只要输入文件始终具有相同顺序的列。