我正在尝试创建一个转换器来读取一个非常长的文本文件,查找包含某个字符串的行。当找到这个字符串时,它应该将它找到的行写入新文件以及之前和之后的其他行。
我的应用程序有效但只是在它创建的所有行组中重复第一个找到的行。
例如,旧文件中的组如下所示:
[PARTICLE930]
INDEX = 930 ;º§¶óÅä076_¼ÕµîÀÌÆåÆ®_¿À¸¥
ABSAXIS=0
PARTICLE=.\Chef\60LV_WHITE\B\BF\076\hand_eff_r.spt
我想只提取以PARTICLE=.\
开头的行,并自动创建它周围的新行。因为组号是顺序的并且没有间隙,所以我不需要提取索引号,我可以动态创建它。
到目前为止我的代码:
Dim source As String = "Particle.ini"
Dim dest As String = "CParticle.ini"
Dim path As String = Application.StartupPath
Dim max As Integer = 1233
Dim l_pnum As String = "[PARTICLE{0}]"
Dim l_index As String = "INDEX = {1}"
Dim l_absaxis As String = "ABSAXIS=0"
Dim l_particle As String = "{2}"
If System.IO.File.Exists(path & "\" & source) Then
Dim objReader As New System.IO.StreamReader(path & "\" & source)
Dim objWriter As New System.IO.StreamWriter(path & "\" & dest, True)
objWriter.WriteLine("[PARTICLE_INFO]")
objWriter.WriteLine("MAXPARTICLE=" & max.ToString)
Dim loop_num As Integer = 1
Do While objReader.Peek() <> -1
Dim line_read As String = objReader.ReadLine()
If line_read.Contains("PARTICLE=.\") Then
l_pnum = l_pnum.Replace("{0}", loop_num.ToString)
l_index = l_index.Replace("{1}", loop_num.ToString)
l_particle = l_particle.Replace("{2}", line_read)
objWriter.WriteLine(l_pnum)
objWriter.WriteLine(l_index)
objWriter.WriteLine(l_absaxis)
objWriter.WriteLine(l_particle)
loop_num = loop_num + 1
End If
Loop
Else
MessageBox.Show("File does not exist" & vbNewLine & path & "\" & source)
End If
正如我上面所说的那样,它可以正常工作,但它只是重复索引1
一遍又一遍,与要转换的组一样多次。
实际上,我想要做的就是从文件中删除所有白色空白和外来字符,同时保留其结构。
我不确定我在这里做错了什么。有人能帮忙吗?
答案 0 :(得分:1)
看起来你在第一次替换时擦除了你的格式,因此它永远不会写下一条记录。
你设置你的字符串:
Dim l_pnum As String = "[PARTICLE{0}]"
Dim l_index As String = "INDEX = {1}"
Dim l_absaxis As String = "ABSAXIS=0"
Dim l_particle As String = "{2}"
然后,当您编写第一条记录时,将结果替换为您的结果,这意味着您不再需要格式化来写出下一条记录。
l_pnum = l_pnum.Replace("{0}", loop_num.ToString)
l_index = l_index.Replace("{1}", loop_num.ToString)
l_particle = l_particle.Replace("{2}", line_read)
创建临时变量以保存结果或使用结果而不将其分配给初始字符串。
即
objWriter.WriteLine(l_pnum.Replace("{0}", loop_num.ToString))
objWriter.WriteLine(l_index.Replace("{1}", loop_num.ToString))
objWriter.WriteLine(l_absaxis)
objWriter.WriteLine(l_particle.Replace("{2}", line_read))