Vb.net 在StreamReader循环中,有没有办法强制读取下一行?
我正在处理一个txt文件,我想知道在我使用了streamreader当前读取的值之后,是否有办法强制它读取下一行 我的代码:Vb.net 在StreamReader循环中,有没有办法强制读取下一行?,vb.net,while-loop,streamreader,Vb.net,While Loop,Streamreader,我正在处理一个txt文件,我想知道在我使用了streamreader当前读取的值之后,是否有办法强制它读取下一行 我的代码: Private Sub subTest() Dim sr As New StreamReader("d:\input\cleanedUp.txt") Dim doc As New XmlDocument Dim root As XmlElement = doc.CreateElement("Views") Dim ns As String
Private Sub subTest()
Dim sr As New StreamReader("d:\input\cleanedUp.txt")
Dim doc As New XmlDocument
Dim root As XmlElement = doc.CreateElement("Views")
Dim ns As String = sr.ReadLine()
Dim nsAtt As XmlAttribute = doc.CreateAttribute("ClientCode")
nsAtt.Value = ns
root.Attributes.Append(nsAtt)
While Not sr.EndOfStream
Dim sLine As String = sr.ReadLine
doc.AppendChild(root)
Dim child As XmlElement = doc.CreateElement("View")
root.AppendChild(child)
Dim newAtt As XmlAttribute = doc.CreateAttribute("Name")
newAtt.Value = sLine
child.Attributes.Append(newAtt)
Dim subChild As XmlElement = doc.CreateElement("Criteria")
child.AppendChild(subChild)
subChild.InnerText = sLine
End While
sr.Close() : sr.Dispose()
Dim sett As New XmlWriterSettings
sett.Indent = True
Dim sw As XmlWriter = XmlWriter.Create("d:\input\data.xml", sett)
doc.Save(sw)
sw.Flush() : sw.Close()
End Sub
结果是:
<?xml version="1.0" encoding="utf-8"?>
<Views ClientCode="WSMCABS">
<View Name="vACCESSONE">
<Criteria>vACCESSONE</Criteria>
</View>
<View Name="ACCESSONE">
<Criteria>ACCESSONE</Criteria>
</View>
</Views>
<?xml version="1.0" encoding="utf-8"?>
<Views ClientCode="WSMCABS">
<View Name="vACCESSONE">
<Criteria>ACCESSONE</Criteria>
</View>
<View Name="vSample2">
<Criteria>SAMPLE2</Criteria>
</View>
</Views>
真空塞松
存取器
我想要的是:
<?xml version="1.0" encoding="utf-8"?>
<Views ClientCode="WSMCABS">
<View Name="vACCESSONE">
<Criteria>vACCESSONE</Criteria>
</View>
<View Name="ACCESSONE">
<Criteria>ACCESSONE</Criteria>
</View>
</Views>
<?xml version="1.0" encoding="utf-8"?>
<Views ClientCode="WSMCABS">
<View Name="vACCESSONE">
<Criteria>ACCESSONE</Criteria>
</View>
<View Name="vSample2">
<Criteria>SAMPLE2</Criteria>
</View>
</Views>
存取器
样本2
您可以测试循环中是否有另一行可用,并执行另一个ReadLine:
While Not sr.EndOfStream
Dim sLine As String = sr.ReadLine
DoSomethingWithLine(sLine)
If Not sr.EndOfStream Then
sLine = sr.ReadLine
DoSomethingElseWithLine(sLine)
End If
End While
所以我遇到的问题是,读者会为每一行读到的内容创建一个新的子/子孩子,相反,我想要一个有多个子孩子的孩子。所以这有点像黑客,但我通过设置一个循环来实现这一点,循环中的某些条件适用于我的情况。对于其他试图完成类似任务的人来说,这可能不是最好的答案,但它对我来说很有效,因为我的文本文件由SQL视图组成,这些视图以“v”开头,后跟特定视图的条件。然后,当程序看到行上读取了另一个视图(以“v”开头)时,它会停止添加额外的子孩子节点
While Not sr.EndOfStream
doc.AppendChild(root)
Dim child As XmlElement = doc.CreateElement("View")
root.AppendChild(child)
Dim newAtt As XmlAttribute = doc.CreateAttribute("Name")
newAtt.Value = sLine
child.Attributes.Append(newAtt)
If sLine.StartsWith("v") Then
sLine = sr.ReadLine
While Not sLine.StartsWith("v")
Dim subChild As XmlElement = doc.CreateElement("Criteria")
child.AppendChild(subChild)
subChild.InnerText = sLine
sLine = sr.ReadLine
If sLine = Nothing Then
sLine = sr.ReadLine
End If
If sLine = Nothing Then
Exit While
End If
End While
End If
End While
sr.Close() : sr.Dispose()
我同意@SLaks,为什么不调用streamreader的ReadLine()函数呢?您介意发布一个代码示例吗?发布用作输入的cleanup.txt。同上,调用readline()-每次调用占用一行。注意,在进入While循环之前,您的代码占用了DIM ns中的一行。使用您的流逻辑移动模糊sLine。。。如果Dim ns为,则在While循环的底部,使用sLine=Readline()加载下一行。