找回密码
 加入
搜索
查看: 3180|回复: 13

[系统综合] NULL无效字符,0字符,截断符问题,要怎么解决啊。(感谢zghwelcome,已解决!)

[复制链接]
发表于 2017-6-16 17:04:59 | 显示全部楼层 |阅读模式
本帖最后由 28002673 于 2017-6-16 20:17 编辑

我附件里面有两个一模一样的TXT文件,带0字符.txt 和 不带0字符.txt,带0字符.txt用正则不能正常提取整段字符串。。
带0字符.txt的原文件是由计费软件生成的,AU3和批处理都提取不了。
弄了一晚上都没弄好,无意间才发现原来是0字符在作怪。。
大神帮我看看吧!

还有。。。有什么函数可以判断文本是否带0字符呢?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2017-6-16 19:16:29 | 显示全部楼层
#include <String.au3>
#include <Array.au3>
;~ Local $IP = @IPAddress1
Local $IP = "192.168.1.110"
Local $sFile = @ScriptDir & '\2.txt'
Local $open = FileOpen($sFile, 16)
Local $sRead = FileRead($open)
FileClose($open)

$sOutBin = ''
$sRead_reg = StringRegExp($sRead, '.{2}', 3)
If Not @error Then
        For $i = 0 To UBound($sRead_reg) - 1
                $sSplit = $sRead_reg[$i]
                $sOutBin = $sOutBin & StringReplace($sSplit, '00', '20')
        Next
EndIf

$sRead = BinaryToString($sOutBin, 1)
$sRead = StringRegExp($sRead, '(\V*?' & $IP & '\V*\v*)', 3)
MsgBox(4096, "测试", $sRead[0])
Local $array1 = _StringExplode($sRead[0], " ", 0)
MsgBox(4096, "  网吧用户上网信息", "机   号   :" & $array1[11] & @CRLF & "用户类型:" & $array1[2] & @CRLF & "上机区域:" & $array1[12] & @CRLF & "计费类型:" & $array1[3] & @CRLF & "上机时长:" & $array1[8] & @CRLF & "卡上余额:" & $array1[4] & @CRLF & "I  P 地址:" & $array1[10] & @CRLF & "身份证号:" & $array1[1], 60)
_ArrayDisplay($array1, "StringExplode 0")

评分

参与人数 1金钱 +20 收起 理由
28002673 + 20

查看全部评分

 楼主| 发表于 2017-6-16 19:26:47 | 显示全部楼层
本帖最后由 28002673 于 2017-6-16 19:35 编辑

谢谢这位兄弟,我试了下,还是会出错哦!

你试了没问题吗??难道是我AU3版本有问题..

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 2017-6-16 19:31:27 | 显示全部楼层
本帖最后由 28002673 于 2017-6-16 20:07 编辑

.......晕
Local $sFile = @ScriptDir & '\2.txt' 文件名忘记改了。。
测试通过!
谢谢 热心的 zghwelcome 兄弟!!只是还有好多地方看不懂。。只有慢慢消化了。。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2017-6-16 20:35:34 | 显示全部楼层
回复 4# 28002673


    原理是,二进制方式读取,,然后替换二进制00为20,因为NULL在ascii中是00,而一般的空格是20,所以到这里就已经变成你的另一个附件,不带null那个一样的文本了。然后就是正则匹配,就是你自己的那个代码了
 楼主| 发表于 2017-6-16 20:58:22 | 显示全部楼层
回复 5# yamakawa

嗯,经你这样讲解之后就很好理解了。。谢谢!
 楼主| 发表于 2017-6-17 08:43:02 | 显示全部楼层
本帖最后由 28002673 于 2017-6-17 08:53 编辑

回复 2# zghwelcome

哎,可惜我不会,不然的话我就按照zghwelcome兄弟的这个思路专门写一个查找NULL字符和替换NULL字符为空格的UDF出来 …
发表于 2017-6-17 11:35:07 | 显示全部楼层
回复  zghwelcome

哎,可惜我不会,不然的话我就按照zghwelcome兄弟的这个思路专门写一个查找NULL字符和 ...
28002673 发表于 2017-6-17 08:43



   
Local $str = _FileRead_null2space(@ScriptDir & '\带0字符.txt')
MsgBox(0, 'null2space', $str)

Func _FileRead_null2space($sFile)
        Local $hFO = FileOpen($sFile, 16)
        If $hFO = -1 Then Return SetError(1)
        Local $sRead = FileRead($hFO)
        FileClose($hFO)
        Return BinaryToString(StringRegExpReplace($sRead, '((?:..)*?)00', '${1}20'))
EndFunc   ;==>_FileRead_null2space

评分

参与人数 2金钱 +60 收起 理由
28002673 + 20
zghwelcome + 40 A版好强,之前也想用正则,没有任何头绪。

查看全部评分

发表于 2017-6-17 12:06:39 | 显示全部楼层
学了一招,,,a版正则好牛,,,俺正则不行,,思路也是2楼那哥们一样,,,
发表于 2017-6-18 08:24:55 | 显示全部楼层
没看很懂   学习了
 楼主| 发表于 2017-6-18 21:36:34 | 显示全部楼层
afan 发表于 2017-6-17 11:35


A版好厉害啊.....

但是为了让这个UDF具有更好的适用性,看A版能不能再稍微修改一下。。

第一,这个UDF既能作用于文件,也能直接作用于字符串,可以给UDF加个可选参数。

第二,让这个UDF有一个返回值,来判断指定的文件或字符串是否带有NULL字符,因为NULL字符不可见,有时候判断起来很麻烦。。

不知道说得是否贴切,,望采纳。。
发表于 2017-6-18 22:49:06 | 显示全部楼层
回复 11# 28002673


    可以~
Local $str = _null2space(@ScriptDir & '\含null.txt')
MsgBox(0, 'null数量' & @extended, $str)

Func _null2space($sFOB, $IsFile = 1)
        ;$sFOB 文件路径名或二进制字符串;
        ;$IsFile 指定第一个参数是文件名(=1默认),否则识别为字符串
        ;返回值:含null字符则替换为空格并返回,替换数量保存在@extended宏中
        ;    不含null字符则返回字符串,并设置@Error=1
        Local $sRead = $sFOB
        If $IsFile Then
                Local $hFO = FileOpen($sFOB, 16)
                If $hFO = -1 Then Return SetError(1)
                $sRead = FileRead($hFO)
                FileClose($hFO)
        EndIf
        If Not StringRegExp($sRead, '^((?:..)*?)00') Then Return SetError(1, 0, BinaryToString($sRead))
        Local $sRER = StringRegExpReplace($sRead, '((?:..)*?)00', '${1}20')
        Return SetExtended(@extended, BinaryToString($sRER))
EndFunc   ;==>_null2space
 楼主| 发表于 2017-6-19 00:27:46 | 显示全部楼层
本帖最后由 28002673 于 2017-6-19 02:52 编辑

回复 12# afan

A版,我试了一下,好像有点小问题哦,,如果作用于字符串的话,需要先转换为二进制方式读取,所以这个UDF作用于字符串的时候,也应该自动将字符串转换成二进制读取
Local $file = FileOpen("带0字符.txt",16)  ;文件要以二进制打开文本才有效
Local $sFOB = FileRead($file)
Local $str = _null2space($sFOB,0)
MsgBox(0, 'null数量' & @extended, $str)

Func _null2space($sFOB, $IsFile = 1)
        ;$sFOB 文件路径名或二进制字符串;
        ;$IsFile 指定第一个参数是文件名(=1默认),否则识别为字符串
        ;返回值:含null字符则替换为空格并返回,替换数量保存在@extended宏中
        ;    不含null字符则返回字符串,并设置@Error=1
        Local $sRead = $sFOB
        If $IsFile Then
                Local $hFO = FileOpen($sFOB, 16)
                If $hFO = -1 Then Return SetError(1)
                $sRead = FileRead($hFO)
                FileClose($hFO)
        EndIf
        If Not StringRegExp($sRead, '^((?:..)*?)00') Then Return SetError(1, 0, BinaryToString($sRead))
        Local $sRER = StringRegExpReplace($sRead, '((?:..)*?)00', '${1}20')
        Return SetExtended(@extended, BinaryToString($sRER))
EndFunc   ;==>_null2space
Local $file = FileOpen("带0字符.txt")  ;也就是说我应该只要这样就可以了
Local $sFOB = FileRead($file)
Local $str = _null2space($sFOB,0)
MsgBox(0, 'null数量' & @extended, $str)


然后我觉得这个UDF的思路应该是这样的。。
首先将文件或字符串都转换成二进制方式读取,
然后查找文件或字符串里面有没有NULL字符,如果没有NULL字符就返回字符串,并给一个返回值(表示未找到NULL字符),因为如果没有NULL字符的话,后面的替换就没意义了
如果有NULL字符就将其替换成空格,再转换回正常编码,也给一个返回值(表示替换成功)。
如果这样应该就是一个完美的UDF了。。
不知道思路是否正确,还望指正。。
发表于 2017-6-19 11:15:59 | 显示全部楼层
回复 13# 28002673


    仔细看说明,第一个参数已说明,$sFOB 为“文件路径名或二进制字符串”,返回值也跟你的理解一致。
如果代入非二进制的明文字符串,那应该是没有null字符的,那也就没有任何意义了。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-3-29 07:53 , Processed in 0.092213 second(s), 29 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表