| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2419 人关注过本帖, 2 人收藏
标题:求教对TXT文件的灵活定位修改的程序写法
只看楼主 加入收藏
ictest
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:333
专家分:114
注 册:2010-2-17
结帖率:70%
收藏(2)
已结贴  问题点数:20 回复次数:13 
求教对TXT文件的灵活定位修改的程序写法
如附件TXT文本文件,想用三种方法来修改,修改完后保存的文件名不变。
第一种方法:
一键修改:按一下按钮,原来乱序的NO:,被重新命名从NO:1——NO: n,(只修改NO行,其他行不变。)

第二种方法:
顺序修改:按“开始”键,出现第一个NO,例如NO: 19,在后面的一个文本框内输入一个数字,如5,该行就变成NO: 5;按“下一个”键,出现第一个NO,例如NO: 18,在后面的文本框内输入一个数字,如7,该行就变成NO: 7。。。。。。以此类推,直至该文本文件里的所有NO全部改完,如果文本框为空并点击“下一个”键,则文本文件中对应的NO值不变。注意:还要有“上一个”的功能。按保存键保存。

第三种方法:
跳跃修改:按“开始”键,两个文本框解除锁定,分别输入一个数字,前一个文本框里的数字用于寻找,寻找文本文件中NO:后面的数字;后边文本框里的数字是用于替换的。逻辑是,先在文本文件中的NO:后面查找前一个数字,如果不存在就提醒,如果存在就将后面一个数字在文本文件中替换前面找到的数字。。按保存键保存。

记录.rar (589 Bytes)
搜索更多相关主题的帖子: 文本文件 文本框 命名 
2017-04-06 11:15
ictest
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:333
专家分:114
注 册:2010-2-17
收藏
得分:0 
第二种方法写的有问题,重改如下:
顺序修改:按“开始”键,软件界面上出现第一个NO,例如NO: 19,在后面的一个文本框内输入一个数字,如5,按“下一个”键,文本文件中的NO: 19就被改成NO: 5,同时界面上出现第二个NO,例如NO: 18,在后面的文本框内输入一个数字,如7,按“下一个”键,文本文件中的NO: 18就被改成NO: 7。。。。。。以此类推,直至该文本文件里的所有NO全部改完,如果文本框为空并点击“下一个”键,则文本文件中对应的NO值不变。注意:还要有“上一个”的功能。。
2017-04-06 16:17
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:20 
根据你的附件,
第一种方法可以。
读文件,如果去掉空格后,以 NO:  开头的,这行重新生成内容。写入临时文件,然后删原文件,改名。

第二种方法:
与第一种方法类似,查找 NO: ,取数值,显示,允许修改。
建议修改的数据保存到数组里,然后最后保存时,一次性保存。按第一种方法,只是不用序号,而用保存的数组里的数据去重新生成内容。

第三种方法:
也是类似的操作,只是查找 以 NO: +指定数据开头的,重新生成内容,写入。


授人于鱼,不如授人于渔
早已停用QQ了
2017-04-06 16:44
ictest
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:333
专家分:114
注 册:2010-2-17
收藏
得分:0 
关于第一种方法,我已经可以做到以下地步(读出该行内容、准备写入的内容、行号也可以提取出来),问题是如何写入该行号,也就是将该行替换,写入临时文件,然后删原文件,改名
Dim h As Long, LTxt As String, wjt As Variant
Dim temp
h = FreeFile
Dim N As Long, m1 As Long
m1 = 1
Open (Dir1.Path & "\" & File1.FileName) For Input As h
Do While Not EOF(h)
    Line Input #h, LTxt
    N = N + 1
    wjt = Split(LTxt, "NO: ")
    If UBound(wjt) = 1 Then
                Label1.Caption = LTxt
                Label2.Caption = "NO: " & m1
                m1 = m1 + 1
   End If
Loop
Close
 MsgBox "结束"


恳求这一段功能源码,谢谢!
2017-04-06 17:28
ictest
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:333
专家分:114
注 册:2010-2-17
收藏
得分:0 
麻烦版主大大帮我看看,谢谢!
2017-04-06 20:33
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:0 
程序代码:
Option Explicit

Dim No() As Long            '原始序号
Dim No2() As Long           '新序号
Dim NoIndex As Long         '当前显示的序号

Private Sub Command1_Click()

'方法一:一键修改,第一种实现方法
'Call 顺序写入("C:\Users\CC\Desktop\记录.txt")

'方法一:第二种实现方法,可以删 顺序写入 代码,提高代码复用性
Call 读序号("C:\Users\CC\Desktop\记录.txt", No())
Dim i As Long
For i = 1 To UBound(No)
    No(i) = i           '按顺序排序号
Next i
Call 保存顺序("C:\Users\CC\Desktop\记录.txt", No())

End Sub

Private Sub Command2_Click()
'上一条
No2(NoIndex) = Val(Text1.Text)
Call 显示序号(-1)

End Sub

Private Sub Command3_Click()
'下一条
No2(NoIndex) = Val(Text1.Text)
Call 显示序号(1)

End Sub

Private Sub Command4_Click()
'方法二初始化程序
Call 读序号("C:\Users\CC\Desktop\记录.txt", No())
NoIndex = 1

ReDim No2(UBound(No))
Dim i As Long
For i = 1 To UBound(No)
    No2(i) = No(i)
Next i

Call 显示序号

End Sub

Private Sub Command5_Click()
'方法二和方法三保存结果
Call 保存顺序("C:\Users\CC\Desktop\记录.txt", No2())

End Sub



'---------------------------------------------------
Public Sub 顺序写入(Filename As String)
'文件保存,修改NO序号为顺序号
'方法一的第一种实现方法

Dim i As Long
Dim h1 As Long, h2 As Long
Dim p As String
Dim s As String

p = App.Path
If Right(p, 1) <> "\" Then p = p & "\"

If Dir(Filename) = "" Then
    MsgBox "原文件不存在", vbCritical, "错误"
    Exit Sub
End If

h1 = FreeFile
Open Filename For Input As h1
h2 = FreeFile
Open p & "~tmp.txt" For Output As h2

Do While Not EOF(h1)
    Line Input #h1, s
    If Left(Trim(s), 4) = "NO: " Then           '复制你的,含空格??
        i = i + 1
        s = "NO: " & i
    End If
    Print #h2, s
Loop
Close #h1
Close #h2

Kill Filename                      '删旧文件
Name p & "~tmp.txt" As Filename    '重命名为目标文件,Name 可以在不同驱动器之间移动文件以完成重命名

MsgBox "完成"

End Sub

Public Sub 读序号(Filename As String, order() As Long)
'读文件里的顺序
'使用一次性读文件的方式

If Dir(Filename) = "" Then
    MsgBox "原文件不存在", vbCritical, "错误"
    Exit Sub
End If

Dim i As Long, j As Long
Dim s As String
Dim h As Long

Dim m() As String
Dim n() As Long

h = FreeFile

    Open Filename For Binary As #h        '打开文件
        '直接读整个文件的所有的内容,按字节读,并转换为 Unicode 的VB默认字符串类型
        s = StrConv(InputB$(LOF(h), #h), vbUnicode)
    Close #h
    
m = Split(s, vbCrLf)        'Windows 平台,没做 Linux 平台兼容
For i = 0 To UBound(m)
    m(i) = Trim(m(i))
    If Left(m(i), 4) = "NO: " Then
        j = j + 1
    End If
Next i

ReDim order(j)
j = 0
For i = 0 To UBound(m)
    m(i) = Trim(m(i))
    If Left(m(i), 4) = "NO: " Then
        j = j + 1
        order(j) = Val(Mid(m(i), 5))
    End If
Next i
End Sub

Public Sub 显示序号(Optional 位移 As Long = 0)
On Error Resume Next
If IsError(UBound(No)) Then
    Exit Sub            '发现错误时不显示
End If

On Error GoTo 0

NoIndex = NoIndex + 位移
If NoIndex > UBound(No) Then
    NoIndex = 1
End If

If NoIndex < 1 Then
    NoIndex = UBound(No)
End If

Label1.Caption = No(NoIndex)            '原始值
Text1.Text = No2(NoIndex)               '修改后的值

End Sub

Public Sub 保存顺序(Filename As String, order() As Long)

Dim i As Long
Dim h1 As Long, h2 As Long
Dim p As String
Dim s As String

p = App.Path
If Right(p, 1) <> "\" Then p = p & "\"

If Dir(Filename) = "" Then
    MsgBox "原文件不存在", vbCritical, "错误"
    Exit Sub
End If

h1 = FreeFile
Open Filename For Input As h1
h2 = FreeFile
Open p & "~tmp.txt" For Output As h2

Do While Not EOF(h1)
    Line Input #h1, s
    If Left(Trim(s), 4) = "NO: " Then           '复制你的,含空格??
        i = i + 1
        s = "NO: " & order(i)                   '仅此与顺序文件不同
    End If
    Print #h2, s
Loop
Close #h1
Close #h2

Kill Filename                      '删旧文件
Name p & "~tmp.txt" As Filename    '重命名为目标文件,Name 可以在不同驱动器之间移动文件以完成重命名

MsgBox "完成"
End Sub


-------------------
方法3,在no里查找数据,找到,把数据写入 no2 里,最后保存。与方法类似而以。
代码略。

------------
方法1,也可以使用方法2 的代码实现,自己看代码,不解释了。
核心,就是读文件,保存文件。


授人于鱼,不如授人于渔
早已停用QQ了
2017-04-06 21:25
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:0 
程序代码:
For i = 0 To UBound(m)
    m(i) = Trim(m(i))
    If Left(m(i), 4) = "NO: " Then
        j = j + 1
    End If
Next i

ReDim order(j)
j = 0
For i = 0 To UBound(m)
    m(i) = Trim(m(i))
    If Left(m(i), 4) = "NO: " Then
        j = j + 1
        order(j) = Val(Mid(m(i), 5))
    End If
Next i

这一段是我的习惯写法。
redim Preserve 关键字,可以省略一个循环。
程序代码:
For i = 0 To UBound(m)
    m(i) = Trim(m(i))
    If Left(m(i), 4) = "NO: " Then
        j = j + 1
        ReDim Preserve No(j)
        No(j) = Val(Mid(m(i), 5))
    End If
Next i


授人于鱼,不如授人于渔
早已停用QQ了
2017-04-06 21:31
ictest
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:333
专家分:114
注 册:2010-2-17
收藏
得分:0 
谢谢版主大大的帮助,好好让我消化消化,相信一定会从中学习到很多经验和知识,再次谢谢!
2017-04-06 22:27
ictest
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:333
专家分:114
注 册:2010-2-17
收藏
得分:0 
经过这段时间的学习和试运行,有个问题想请教版主:

程序中修改序号的第一种方法(顺序修改),程序里只能从1开始自动编号修改,但是我想添加一个文本框,默认是1,但也可以从文本框内手填的数字开始自动编号,这个功能怎么增加呢?我尝试了很久,感觉无处可加。请版主教教我。谢谢!
2017-04-11 16:57
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:0 
'方法一:第二种实现方法,可以删 顺序写入 代码,提高代码复用性
Call 读序号("C:\Users\CC\Desktop\记录.txt", No())
Dim i As Long
For i = 1 To UBound(No)
    No(i) = i + 起始序号 -1          '按顺序排序号,这里把你的初始序号加上。
Next i
Call 保存顺序("C:\Users\CC\Desktop\记录.txt", No())

-------------------------
Do While Not EOF(h1)
    Line Input #h1, s
    If Left(Trim(s), 4) = "NO: " Then           '复制你的,含空格??
        i = i + 1
        s = "NO: " & i + 起始序号 -1          '按顺序排序号,这里把你的初始序号加上。
    End If
    Print #h2, s
Loop


授人于鱼,不如授人于渔
早已停用QQ了
2017-04-11 18:52
快速回复:求教对TXT文件的灵活定位修改的程序写法
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.098057 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved