一个算是比较难的文本读取和处理问题,是不是涉及到了ASCCII?求大神支招

qq_23152875 2017-08-06 04:32:05
各位大神你们好。。。。请帮小弟下吧。

首先,公司领导有个要求,让我把这个文件读出来。我大概看了看,应该是个外部程序的日志。然后让我找出需要的数据部分的特点,进行搜索,然后读出那部分(那行),进行文字拆解分析得出需要的结果。
然后我打开看傻了眼,内容是这样的。如下图





然后

我用NOTEPAD++打开后,内容是这样的(如下图)

(编码设置的big5)




我想,应该是文件有自己的格式,感觉领导的意思是让我把这个外部程序解读了。
和领导稍微了解了下,那个notepad++读出来应该是正确的。NUL\EOT\ESC那些应该没什么用(应该是ASCII字符?),把他们处理好,格式弄正确了,我再进行解析应该就可以了。于是我试了试

Dim sA As String
Open "c:\1.txt" For Binary As #1
sA = Space(LOF(1)) '注释:用空格填充sA变量
Get #1, , sA '注释:用Get语句获取文件全部内容
RichTextBox1.Text = sA 'text1.txt好像有32K限制,所以用了richtextbox
Close #1

可以读出来乱七八糟的,我不知道如何把那些null eof如何清理掉,因为我读出来根本就是些ASCII符+gbk字符。如果清理不掉ASCII,,,,没法继续去解析(转成BIG5)这些了。

求大神指点应该怎么做才能清理掉那些ASCII字符,希望能给出具体语句。万分感谢。100分满分送上


原文件在这里
https://pan.baidu.com/s/1i5N28rN
...全文
525 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
PctGL 2017-08-13
  • 打赏
  • 举报
回复
文件是公开的数据格式,相对就简单多了 如果是不公开的数据格式,就需要多个类似文件,反复对比,测试,解析才能清楚数据结构 需要注意的是,你使用的工具不对,解析这种文件的关键工具 winhex 之类的16进制数据查看器
赵4老师 2017-08-09
  • 打赏
  • 举报
回复
赵4老师 2017-08-08
  • 打赏
  • 举报
回复
ACT FoxPro Foxdoc Action Diagram ACT Documenting wizard action diagram (Microsoft Visual FoxPro) APP Generated application or active document (Microsoft Visual FoxPro) APP FoxPro Generated Application CDX Microsoft's Visual Foxpro index DBC Microsoft's Visual FoxPro database Container file y Act!, Clipper,FoxPro, Arago, Wordtech, xBase, and similar database o DBX Microsoft's Visual FoxPro Table file DCT Microsoft's Visual FoxPro database container file DCX Microsoft's Visual FoxPro database container file ERR Compilation error file (Microsoft Visual FoxPro) ESL Distributable support library file (Microsoft Visual FoxPro) FKY Macro (Microsoft FoxPro) FLL Distributable dynamic link library (DLL) (Microsoft Visual FoxPro) FMT Csreen format file (Microsoft Visual FoxPro) FP Configuration file (FoxPro) FPC Catalog file (FoxPro) FPT Memo fields (Microsoft FoxPro) FRT Report menu (FoxPro) FRX Report (Microsoft FoxPro) FXP Compiled source code (FoxPro)
赵4老师 2017-08-08
  • 打赏
  • 举报
回复
引用 19 楼 Runnerchin 的回复:
回帖前不看帖吗?还是强行装成不看帖?早就说了这是FoxPro啊
这就叫选择性无视。
X-i-n 2017-08-08
  • 打赏
  • 举报
回复
回帖前不看帖吗?还是强行装成不看帖?早就说了这是FoxPro啊
舉杯邀明月 2017-08-08
  • 打赏
  • 举报
回复
引用 17 楼 zhao4zhong1 的回复:
DBSF开头的文件应该是符合某种标准的数据库文件。我猜。
这个嘛……应该是有“某种标准”的。 只是,你能找到这是哪种类型的数据库吗?你能找到读写这种数据库的接口库(dll)吗?  如果找不到“公开接口”,你能自己写代码解析这种数据库吗?
赵4老师 2017-08-08
  • 打赏
  • 举报
回复
DBSF开头的文件应该是符合某种标准的数据库文件。我猜。
舉杯邀明月 2017-08-08
  • 打赏
  • 举报
回复
反正文件数乱七八糟的,这样处理后可能也没有提取完。
舉杯邀明月 2017-08-08
  • 打赏
  • 举报
回复
刚才用工具软件看了一下文件数据。 然后弄了段提取代码:
Private Sub Command1_Click()
   Dim arrBuff(23&)  As Byte
   Dim arrData()  As Byte
   Dim strTemp    As String
   Dim i&, j&, k  As Long
   Dim w&, u&, m  As Long
   
   
   Open "E:\Temp\1organize.dat" For Binary As #1
   m = LOF(1)
   ReDim arrData(m - 1&)
   Get #1, 1&, arrData
   Close
   j = 0&:  i = 0&
   w = m - 64&
   Do
      If (i > w) Then Exit Do
      u = 0&
      For k = i To 7& + i
         If (0 = arrData(k)) Then Exit For
         u = 1& + u
      Next
      If (5& <= u) Then
         If (0& = arrData(k)) Then
            k = 1& + k
            If (160& < arrData(k)) Then
               Call CopyMemory(arrBuff(0&), arrData(k), 24&)
               strTemp = MultiByteToUTF16(arrBuff, CP_BIG5)
               u = InStr(1&, strTemp, vbNullChar)
               j = 1& + j
               Debug.Print j, Left$(strTemp, u - 1&)
               i = 24& + i
            Else
               i = k
            End If
         Else
            i = 1& + i
         End If
      Else
         i = 1& + i
      End If
   Loop
End Sub
输出数据:
 1            打架沒力
 2            反轉世界
 3            反轉世界
 4            打架沒力
 5            打架沒力
 6            打架沒力
 7            打架沒力
 8            打架沒力
 9            巨神狻猊禁衛
 10           帶兵跑路
 11           打架沒力
 12           打架沒力
 13           打架沒力
 14           打架沒力
 15           打架沒力
 16           打架沒力
 17           打架沒力
 18           打架沒力
 19           打架沒力
 20           打架沒力
 21           打架沒力
 22           打架沒力
 23           打架沒力
 24           打架沒力
 25           打架沒力
 26           打架沒力
 27           落花時節又逢君
 28           落花時節又逢君
 29           我
 30           猛將
 31           你
 32           他
 33           軍師
 34           我
 35           軍師
 36           猛將
 37           猛將
 38           攤貨
 39           你
 40           顫抖的奶
 41           顫抖的奶
 42           顫抖的奶
 43           顫抖的奶
 44           方1
 45           方1
 46           方1
 47           軍2
 48           闊少
 49           趙子龍
 50           顫抖的奶
 51           趙子龍
 52           趙子龍
 53           戰謀
 54           戰軍
 55           戰謀
 56           孤戰
 57           孤戰
 58           孤戰
 59           戰軍
 60           孤戰
 61           孤戰
 62           孤戰
 63           戰軍
 64           戰軍
 65           孤戰
 66           孤戰
 67           孤戰
 68           小軍
 69           小軍
 70           闊少
 71           小小小
 72           闊少
 73           小小小
 74           小豪
 75           小豪
 76           闊少
 77           小豪
 78           小小小
 79           小豪
 80           小軍
 81           小小小
 82           小豪
 83           闊少
 84           小軍
 85           小豪
 86           小豪
 87           闊少
 88           小軍
 89           闊少
 90           小豪
 91           闊少
 92           小豪
 93           闊少
 94           小豪
 95           弩車
 96           投石車
 97           投石車
 98           【黃龍士】
 99           【黃龍士】
 100          【黃龍士】
 101          【黃龍士】
 102          【黃龍士】
 103          【黃龍士】
 104          【黃龍士】
 105          【黃龍士】
 106          【黃龍士】
 107          【黃龍士】
X-i-n 2017-08-08
  • 打赏
  • 举报
回复
引用 23 楼 Chen8013 的回复:
[quote=引用 19 楼 Runnerchin 的回复:] 回帖前不看帖吗?还是强行装成不看帖?早就说了这是FoxPro啊
你在4楼的回复,那天下午就看了的。 只是没怎么明白,也无法与这个“文件内容”关联起来………… 我也是一直没有关注FoxPro的,这方面的东西不清楚。 FoxPro的“数据库”文件,不应该是用dat做扩展名的吧? 记得安装VB6企业版的时候,它的“数据库支持”中好象有FoxPro的支持(我安装时取消了的),   难道说,可以安装相应的组件,直接按“数据库”方式打开,然后读取这个文件的信息? [/quote] 这个是FoxPro的备注文件,网上查了一下,这个文件主要用来存放特定字段(备注型M,通用型G)的内容,相当于是主数据库的附加,题主缺的是主数据库文件dbf,如果有这个,直接还原数据库就可以拿到完整数据结构和数据内容。 文件扩展名只有在windows系统里直接运行或者与特定程序进行较强关联的时候才需要用到(dll),系统通过不同扩展名识别其对应的打开程序。如果只是普通的数据文件,没这么多讲究,这个在access的网站上见得比较多,出于安全考虑,经常会将xxx.mdb改成类似 xx#12.asp的文件名。 回到这个文件,从二进制形式进行反解析是可以读取这些字段的值,但是再回想一下,意义有多大(相当于从数据库里直接读出几列孤立数据,比如{张三,15,82,46273842,FSDA,早}),或者有没有别的更合理的做法(让领导想办法搞到另一个文件)。文件解析的时候,如何把二进制内容解析成原始数据确实重要,但是数据结构与数据含意同样重要。题主只有两条路:继续闷头解析这个文件,把所有数据读出来,但是这种方法一定需要实际的验证环境去辅助猜测数据的真实含义(这些辅助的信息不光可以用来帮助解析文件,也可以用来验证自己的解析结果),让数据变得不孤立,而且验证条件越充足越好,需要找领导要更多的信息(比如,知道文件是游戏存档,那我在解析出数据的时候可以把数据往游戏里的数值上去靠,去验证);第二条路,直接找到dbf数据库文件,完工。 再跑个题,如果不为解决这个问题,这个楼里对这个文件进行解析过程的回帖对新手帮助非常大,是个很好的学习案例。
舉杯邀明月 2017-08-08
  • 打赏
  • 举报
回复
引用 19 楼 Runnerchin 的回复:
回帖前不看帖吗?还是强行装成不看帖?早就说了这是FoxPro啊
你在4楼的回复,那天下午就看了的。 只是没怎么明白,也无法与这个“文件内容”关联起来………… 我也是一直没有关注FoxPro的,这方面的东西不清楚。 FoxPro的“数据库”文件,不应该是用dat做扩展名的吧? 记得安装VB6企业版的时候,它的“数据库支持”中好象有FoxPro的支持(我安装时取消了的),   难道说,可以安装相应的组件,直接按“数据库”方式打开,然后读取这个文件的信息?
赵4老师 2017-08-08
  • 打赏
  • 举报
回复
IDX Microsoft FoxPro relational database index file LBT Microsoft FoxPro labels LBX Microsoft FoxPro labels MNT Microsoft FoxPro menus MNX Microsoft FoxPro menus MPR Microsoft FoxPro menus (compiled) PJX Microsoft's Visual Foxpro Project PJT Microsoft's Visual Foxpro Project PRG dBase, Clipper, and FoxPro program source files SCT Microsoft FoxPro forms SCX Microsoft FoxPro forms VCT Microsoft FoxPro class library VCX Microsoft FoxPro class library
赵4老师 2017-08-07
  • 打赏
  • 举报
回复
电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息…… 对电脑而言没有乱码,只有二进制字节;对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A
qq_23152875 2017-08-06
  • 打赏
  • 举报
回复
引用 14 楼 Chen8013 的回复:
你定义那个常量没有? 我在8楼的代码,调用 MultiByteToUTF16( )那儿,CP_BIG5 你直接换成 950就行了。
谢谢大佬。我去试试
舉杯邀明月 2017-08-06
  • 打赏
  • 举报
回复
你定义那个常量没有? 我在8楼的代码,调用 MultiByteToUTF16( )那儿,CP_BIG5 你直接换成 950就行了。
qq_23152875 2017-08-06
  • 打赏
  • 举报
回复
函数看见了。 不过,CP_BIG5的值是 950 。是啥。。。? 没懂,这个如何去定义 程序报类型不符CP_BIG5
qq_23152875 2017-08-06
  • 打赏
  • 举报
回复
引用 10 楼 Chen8013 的回复:
[quote=引用 5 楼 qq_23152875 的回复:] [quote=引用 3 楼 bakw 的回复:] 问题远没有过滤掉字符就可以解决这么简单,他是有格式存储的。 你要了解这个数据库是什么,现在唯一线索是文件开头的四个字符 DBSF,不知道是哪种数据库的打头字符。
因为据我所知,这个文件基本上是不会膨胀的,大小不会无限增大,而且数据较少(最多总计30条固定格式内容变换的样子),所以大大您有没过滤掉那些ASCII的方案指点一二吗,大概关键字我去百度也行。。。。其实只要NOTEPAD++那种读出来就行了,我replace掉nul也好啊。。。。[/quote] 如果你觉得它是“固定的”,那么你要提取的地方,位置、长度也应该是有一定的规律,并且也是固定的吧? 那你不如多比较几个文件,看它的记录长度、记录位置有没有固定参数? 说不定,你只要按“从某一位置起,以固定长度读取每一条’记录‘的数据,再转换编码”,   就可以比较容易的提取出你想要的东西呢。 [/quote] 对的,大佬,就是这个思路。不过,您的代码说MultiByteToUTF16没有定义函数。。。
舉杯邀明月 2017-08-06
  • 打赏
  • 举报
回复
引用 9 楼 qq_23152875 的回复:
. . . . . . . . 非常感谢,我赶紧去试试
Private Declare Function MultiByteToWideChar Lib "Kernel32" ( _
                                 ByVal CodePage As Long, ByVal dwFlags As Long, _
                                 ByRef lpMultiByteStr As Any, ByVal cchMultiByte As Long, _
                                 ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long


Public Function MultiByteToUTF16(bufData() As Byte, CodePage As Long) As String
      Dim BuffSize As Long, DataSize As Long

   DataSize = UBound(bufData) + 1&
   BuffSize = MultiByteToWideChar(CodePage, 0&, bufData(0&), DataSize, 0&, 0&)
   MultiByteToUTF16 = Space$(BuffSize)
   Call MultiByteToWideChar(CodePage, 0&, bufData(0&), DataSize, StrPtr(MultiByteToUTF16), BuffSize)
End Function
CP_BIG5的值是 950 。
舉杯邀明月 2017-08-06
  • 打赏
  • 举报
回复
引用 5 楼 qq_23152875 的回复:
[quote=引用 3 楼 bakw 的回复:] 问题远没有过滤掉字符就可以解决这么简单,他是有格式存储的。 你要了解这个数据库是什么,现在唯一线索是文件开头的四个字符 DBSF,不知道是哪种数据库的打头字符。
因为据我所知,这个文件基本上是不会膨胀的,大小不会无限增大,而且数据较少(最多总计30条固定格式内容变换的样子),所以大大您有没过滤掉那些ASCII的方案指点一二吗,大概关键字我去百度也行。。。。其实只要NOTEPAD++那种读出来就行了,我replace掉nul也好啊。。。。[/quote] 如果你觉得它是“固定的”,那么你要提取的地方,位置、长度也应该是有一定的规律,并且也是固定的吧? 那你不如多比较几个文件,看它的记录长度、记录位置有没有固定参数? 说不定,你只要按“从某一位置起,以固定长度读取每一条’记录‘的数据,再转换编码”,   就可以比较容易的提取出你想要的东西呢。
qq_23152875 2017-08-06
  • 打赏
  • 举报
回复
引用 8 楼 Chen8013 的回复:
转换编码后,只替换掉了 “空字符”(你在Notepad++中看到的 NUL ),然后就是这个效果: 当然这其中还有不少其它的“非标准字符”。也许可以作为“下一步处理的分隔符”呢。
非常感谢,我赶紧去试试
加载更多回复(8)

7,762

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧