点击上方蓝字关注我们
今天我们聊一聊VB中文件数据的读与写,读与写可以让你批量导入计算再把计算结果导出去,而不是人为的输入计算这样效率太低。我今天将从以下几点进行讲解说明:
批量的输入输出控件
文件读写的控件与函数
文件读写计算的例子
1.文件的批量输入输出控件
文件的批量输入输出控件主要有以下两种:
TextBox控件(一般都是软件自带,不可以大量输入,需要设置换行MultiLine为true和出现滚动条ScrollBars为Both。)
RichText控件(该控件是外部控件,需要自己在外部控件中添加引用【为了避免每次都添加该控件最好将外部引用到的控件保存为工程文件】,可以大量输入。)
MSHFlexGrid (该控件为表格控件是外部控件,也是需要自己添加,该控件既可以输入也可以添加比较方便,在该篇中主要用于输出,你也可以自己输入计算并输出)
该篇主要使用TextBox控件进行数据的输入和输出,MSHFlexGrid 也是一个进行数据的输出,在该篇中仅仅是为了让大家熟悉他的功能。
2.文件读写的控件与函数
文件读写的控件我们主要用到以下控件:
CommonDialog1
用它之前我们先来介绍一下它的属性,这个控件是先打开文件文件在选择要读取的文件,我们先从文件的打开说明。
1.打开文件的格式
Open 文件名 [For模式 As [#]文件号
Open CommonDialog1.FileName For Input As #1
其中,文件名是指要打开的文件,可以包含驱动器名及路径名,既可以是常量也可以是字符变量。模式是说明文件打开的方式,对于顺序文件(操作文本较为友好的)而言,有三种模式:
-
Output(输出):也就是向内存写入文件
Input(输入):也就是从内存中读取文件
Append(添加):相当于将数据添加到末尾,有点像JS中的Push方法
2.从文件中读取数据
要读取顺序文件的内容,我们应该以Input模式打开该文件,读取数据格式的有以下三种:
Input # 文件号,字段 1[,字段2] {,.....,}
Line Input # 文件号,字符串变量
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
界面效果
我就知道你“在看”