打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
vb 字符串截取_VB进阶之玩转文件读写
userphoto

2023.02.22 宁夏

关注

今天我们聊一聊VB中文件数据的读与写,读与写可以让你批量导入计算再把计算结果导出去,而不是人为的输入计算这样效率太低。我今天将从以下几点进行讲解说明:

  1. 批量的输入输出控件

  2. 文件读写的控件与函数

  3. 文件读写计算的例子

1.文件的批量输入输出控件

文件的批量输入输出控件主要有以下两种:

  • TextBox控件(一般都是软件自带,不可以大量输入,需要设置换行MultiLine为true和出现滚动条ScrollBars为Both。)

  • RichText控件(该控件是外部控件,需要自己在外部控件中添加引用【为了避免每次都添加该控件最好将外部引用到的控件保存为工程文件】,可以大量输入。)

  • MSHFlexGrid (该控件为表格控件是外部控件,也是需要自己添加,该控件既可以输入也可以添加比较方便,在该篇中主要用于输出,你也可以自己输入计算并输出)

该篇主要使用TextBox控件进行数据的输入和输出,MSHFlexGrid 也是一个进行数据的输出,在该篇中仅仅是为了让大家熟悉他的功能。

           

2.文件读写的控件与函数

文件读写的控件我们主要用到以下控件:

  • CommonDialog1

用它之前我们先来介绍一下它的属性,这个控件是先打开文件文件在选择要读取的文件,我们先从文件的打开说明。

1.打开文件的格式

Open 文件名 [For模式 As [#]文件号

Open CommonDialog1.FileName For Input As #1

其中,文件名是指要打开的文件,可以包含驱动器名及路径名,既可以是常量也可以是字符变量。模式是说明文件打开的方式,对于顺序文件(操作文本较为友好的)而言,有三种模式:

    1. Output(输出):也就是向内存写入文件

    2. Input(输入):也就是从内存中读取文件

    3. Append(添加):相当于将数据添加到末尾,有点像JS中的Push方法

2.从文件中读取数据

要读取顺序文件的内容,我们应该以Input模式打开该文件,读取数据格式的有以下三种:

  1. Input    #  文件号,字段 1[,字段2]  {,.....,}

  2. Line Input    # 文件号,字符串变量

  3. Input $ ( 读取字数,#文件号) 

如下面的数据我们从格式一和格式二读取方式进行说明因为格式三不常用所以这里不做说明,如果感兴趣的读者可以去试试。

1)格式一说明:读出的数据分别放在给出的变量之中,所以要求变量的顺序要和文件中各字段顺序相同(即每个变量应与其对应字段得数据类型一致),通俗来说就是文本文件中的数据要和代码中的数据类型及个数对应否则会报错。

文本文件格式

'点位,X,Y,HI01,,234232.232,23423424,234,1920.358I02,,234232.232,23423424,234,1920.358I03,,234232.232,23423424,234,1920.358

代码

Dim dot#, X#, Y#, H#'定义变量   分别对应 点位,X,Y,H'格式一会全部同时读取Private Sub Command5_Click()    CommonDialog1.Filter = "文本文件(*.txt)|*.txt|所有文件(*.*)|*.*|"    CommonDialog1.ShowOpen '打开文件 或者可以用 CommonDialog1.Action = 1 效果一样    Open CommonDialog1.FileName For Input As #1'这里#1代表文件号        Do While Not EOF(1)  '不满足条件时执行             Input #1, dot,X,Y,H  '这个格式要对应上文本数据中的变量否则无法进行读取会报错             '这里inputText是TextBOx控件重新命名的名称,inputText.Text的主要目的就是把上面的文本数据读入和展示出来便于我们后续对数据进行处理。            inputText.Text = inputText.Text + dot+ X + Y + H + vbCrLf '拼接显示每读完一行数据用vbCrLf进行换行        Loop    Close #1    MsgBox "导入完成", , "提示"End Sub

2)格式二说明(推荐使用):每次从文件中读取一行信息,它不以逗号作为分隔符,而是以回车符作为分隔符,因此此种方式处理文本最为合适。

文本格式

'文本内容的输入格式xa,,12312.1212ya,,233.121a,,12d,,34

代码

Dim strs$'定义要读入的类型变量Private Sub Command5_Click()    CommonDialog1.Filter = "文本文件(*.txt)|*.txt|所有文件(*.*)|*.*|"    CommonDialog1.ShowOpen '打开文件 或者可以用 CommonDialog1.Action = 1 效果一样    CommonDialog1.CancelError = False '用户点击取消后避免报错    inputText.Text = "" '每次导入前清空避免覆盖    Text3.Text = CommonDialog1.FileName '读取文件路径名称    Open CommonDialog1.FileName For Input As #1        Do While Not EOF(1)  '不满足条件时执行            Line Input #1, strs '按行读取这里比格式一少了好多变量因为格式二是按行读取会把全部数据一行一行的读取            '这里inputText是TextBOx控件重新命名的名称,inputText.Text的主要目的就是把上面的文本数据读入和展示出来便于我们后续对数据进行处理。            inputText.Text = inputText.Text + strs + vbCrLf            sInput = inputText.Text '存放导入的数据便于后续        Loop    Close #1    MsgBox "导入完成", , "提示"End Sub
           
           

3.文件读写计算的例子

我们处理文本数据最好选择用格式二的形式来读取并对文件进行处理,我们接下来就用格式二这种方法来撸一个读写文本文件并进行坐标反算的例子。

因为该代码编写较为简单所以不再赘述,有问题可以通过关注我底部的公众号联系我。

本次使用的字符串方法是:

InStr(字符串1,字符串2)在字符1中查找到你所要查找的字符串2并返回该字符串所在的下标

如:

ipos = InStr(sInput, ",,")'这里我们要查找的是",,"两个双引号

完整代码

Option Explicit'放在外面让全部函数都可以使用Const PI = 3.14159265358979Dim xa#, ya#, xb#, yb#, fenmiao#, position%, xx# '已知数据Dim fwj#, dab#  '终点坐标Dim dxa$, dya$, dxb$, dyb$Dim ipos%, strs$, sInput$'全部同时读取Private Sub Command5_Click()    CommonDialog1.Filter = "文本文件(*.txt)|*.txt|所有文件(*.*)|*.*|"    CommonDialog1.ShowOpen '打开文件 或者可以用 CommonDialog1.Action = 1 效果一样    CommonDialog1.CancelError = False '用户点击取消后避免报错    inputText.Text = "" '每次导入前清空避免覆盖    Text3.Text = CommonDialog1.FileName '读取文件路径名称    Open CommonDialog1.FileName For Input As #1        Do While Not EOF(1)  '不满足条件时执行             'Input #1, str '指定文件个数读取文件            Line Input #1, strs '按行读取            inputText.Text = inputText.Text + strs + vbCrLf            sInput = inputText.Text '存放导入的数据便于后续            'Print LOF(1)            'Print EOF(1)            'Print Seek(1)        Loop    Close #1    MsgBox "导入完成", , "提示"End Sub'正算'以下这个要在以上信息读取无误后'反算Public Function coordinateF() As Double    Const PI = 3.14159265358979    Dim dx#, dy#    If Trim(inputText.Text) = "" Then        MsgBox "请您输入已知数据后再计算!", vbApplicationModal + vbExclamation, "友情提示"    Else        '截取读取文件中的数据vbCr回车符      '截取读取文件中的数据vbCr回车符    ipos = InStr(sInput, ",,"): dxa = Left(sInput, ipos - 1):  sInput = Mid(sInput, ipos + 2) '截取到点号xa    ipos = InStr(sInput, vbCr): xa = Val(Left(sInput, ipos - 1)): sInput = Mid(sInput, ipos + 2) '截取到数值12312.1212    ipos = InStr(sInput, ",,"): dya = Left(sInput, ipos - 1):  sInput = Mid(sInput, ipos + 2) '截取到点号ya    ipos = InStr(sInput, vbCr): ya = Val(Left(sInput, ipos - 1)): sInput = Mid(sInput, ipos + 2) '截取到数值12312.1212    ipos = InStr(sInput, ",,"): dxb = Left(sInput, ipos - 1):  sInput = Mid(sInput, ipos + 2) '截取到点号a    ipos = InStr(sInput, vbCr): xb = Val(Left(sInput, ipos - 1)): sInput = Mid(sInput, ipos + 2) '截取到数值12    ipos = InStr(sInput, ",,"): dyb = Left(sInput, ipos - 1):  sInput = Mid(sInput, ipos + 2) '截取到点号d    ipos = InStr(sInput, vbCr): yb = Val(Left(sInput, ipos - 1)): sInput = Mid(sInput, ipos + 2) '截取到数值34    'Print xa; ya; xb; yb    '将截取出来的值添加到表格中    With table        '设置行和列        .Rows = 5: .Cols = 5        '在第一行表头中添加数据        .Row = 0: .Col = 1: .Text = dxa        .Row = 0: .Col = 2: .Text = dya        .Row = 0: .Col = 3: .Text = dxb        .Row = 0: .Col = 4: .Text = dyb        '在第二行中添加数据        .Row = 1: .Col = 1: .Text = xa        .Row = 1: .Col = 2: .Text = ya        .Row = 1: .Col = 3: .Text = xb        .Row = 1: .Col = 4: .Text = yb    End With        dx = xb - xa '△X        dy = yb - ya '△Y        dab = Sqr(dx ^ 2 + dy ^ 2) '获得两点间距离        xx = Atn(Abs(dy / dx)) '获得象限角        If dx > 0 And dy > 0 Then '第一象限            fwj = xx        ElseIf dx < 0 And dy > 0 Then '第二象限            fwj = PI - xx        ElseIf dx < 0 And dy < 0 Then '第三象限            fwj = PI + xx        ElseIf dx > 0 And dy < 0 Then '第四象限            fwj = 2 * PI - xx        ElseIf dx = 0 And dy > 0 Then '方位角为90°            fwj = PI / 2        ElseIf dx = 0 And dy < 0 Then '方位角为270°            fwj = 3 * (PI / 2)        ElseIf dx > 0 And dy = 0 Then '方位角为0°            fwj = 0        ElseIf dx < 0 And dy = 0 Then '方位角为180°            fwj = PI        End If        Call hdTodfm(fwj)    End IfEnd Function'创建函数将弧度转度分秒、度.分秒Public Function hdTodfm(hudu#) As Double    Const PI = 3.14159265358979    Dim du#, fen#, miao#, jd# '已知数据    '默认计算    jd = hudu * (180 / PI)    du = Int(jd)    fen = Int((jd - du) * 60)    miao = ((jd - du) * 60 - fen) * 60    Text4.Text = "D:" & Format(dab, "0.00000") + "m" + vbCrLf + "方位角:" & Format(du, "0") & "°" & Format(fen, "00") & "′" & Format(miao, "00.00") & "″"End Function'计算Private Sub Command2_Click()    Call coordinateFEnd Sub'保存文件Private Sub Command3_Click()    If Text4.Text = "" Then        MsgBox "现在还没有数据,请您计算或输入后再保存吧", vbApplicationModal + vbExclamation, "提示"    Else        CommonDialog1.Filter = "文本文件(*.txt)|*.txt|所有文件(*.*)|*.*|"        CommonDialog1.ShowSave '另存为  或者可以用CommonDialog1.Action=2 效果一样        CommonDialog1.CancelError = False        Open CommonDialog1.FileName For Output As #1            Print #1, Text4.Text '将我们算出的值保存起来        Close #1        MsgBox "保存成功", , "提示"    End IfEnd Sub'清空Private Sub Command4_Click()    inputText.Text = ""End SubPrivate Sub Form_Load()    inputText.Text = ""End Sub'在表格中输入数据表格Private Sub table_KeyPress(KeyAscii As Integer)    With table        '只能输入数字        If IsNumeric(Chr(KeyAscii)) Then            .Text = .Text & Chr(KeyAscii)        ElseIf KeyAscii = 8 Then            If Len(.Text) > 0 Then                .Text = Left(.Text, Len(.Text) - 1)            End If        End If   End WithEnd Sub'删除Private Sub table_KeyUp(KeyCode As Integer, Shift As Integer)    If KeyCode = 46 Then        table.Text = ""    End IfEnd Sub

界面效果

我就知道你“在看”

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
VB中使用PNG格式图片的一种新方法
请问如何利用vb控件提取Excel里的属性?急~~~~~~~~~~~~~~~
基于VB和Direct3D的STL文件可视化研究
vb界面设计
VB编程中的各种对话框,你都知道吗?
全国计算机二级VB复习资料
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服