我希望这个程序打开一个文本文件并找到那些特定的字符,然后将其后的单词添加到列表中(每个字符在列表中都有特定的子项)。 如果没有重复,它可以很好地工作。但如果我有这样的清单:
/* 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
答案 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
这将返回所有行的数组,减去空行和前导字符。
当然,使用上面的代码,您实际上不再需要那些前导字符,只要输入文件始终具有相同顺序的列。