0

我正在尝试创建一个转换器来读取一个非常长的文本文件,以查找包含某个字符串的行。当它找到这个字符串时,它应该将找到的行连同之前和之后的其他行一起写入一个新文件。

我的应用程序有效,但只重复它创建的所有行组中找到的第一行。

例如,旧文件中的组如下所示:

[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一遍又一遍地重复索引,次数与要转换的组一样多。实际上,我想要做的就是从文件中删除所有白色空白和外来字符,同时保留它的结构。

我不确定我在这里做错了什么。有谁能帮忙吗?

4

1 回答 1

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)  

要么创建临时变量来保存您的结果,要么使用结果而不将其分配给您的初始字符串。

IE

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))  
于 2012-09-17T03:17:27.350 回答