我希望该程序打开一个文本文件并找到那些特定的字符,然后将其后的单词添加到列表中(每个字符在列表中都有特定的子项)。如果没有重复,它会很好地工作。但是如果我有这样的列表:
/* 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
我认为“重复字符串”是指文件中有多个项目(每组6列)时如何读取文件。
当前程序仅获取第一项的原因是For
,无论找到多少个给定的子项,您都将在找到该子项的第一个项后退出循环。
解决此问题的一种方法是将您的子项更改_Load
为一个函数,并使其返回一个List(Of ListViewItem)
对象,然后您可以迭代该对象并将其添加到主列表(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
,对返回的字符串进行拆分,ReadAllText
并删除空条目。
接下来,它循环遍历代码,一次6行。在循环中,将创建一个新的ListViewItem,并填充子项,然后将此ListViewItem添加到中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
到您的中clothesList
。
请注意,此代码很脆弱-如果输入文件中的列顺序不正确,或者缺少列,则数据将倾斜,并且如果您尝试读取该程序,则可能会崩溃数组中的一行(来自文件)不存在。当然,您也可以将该代码包装在Try Catch块中。
这仅仅是一种实现方式-我毫不怀疑还有其他方式。但这至少应该使您朝正确的方向前进。
编辑删除前导字符的最简单方法是将它们添加到拆分中,如下所示:
Lines = File.ReadAllText(FileName).Split(New String() _
{ ControlChars.CrLf, "#", "%", "&", "@$", "$*", "*$"}, _
StringSplitOptions.RemoveEmptyEntries)
这将返回所有行的数组,减去空行和前导字符。
当然,使用上面的代码,实际上您不再需要那些前导字符,只要输入文件中的列始终具有相同的顺序即可。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句