NULL无效字符,0字符,截断符问题,要怎么解决啊。(感谢zghwelcome,已解决!)
本帖最后由 28002673 于 2017-6-16 20:17 编辑我附件里面有两个一模一样的TXT文件,带0字符.txt 和 不带0字符.txt,带0字符.txt用正则不能正常提取整段字符串。。
带0字符.txt的原文件是由计费软件生成的,AU3和批处理都提取不了。
弄了一晚上都没弄好,无意间才发现原来是0字符在作怪。。
大神帮我看看吧!
还有。。。有什么函数可以判断文本是否带0字符呢?
{:face (456):} #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)
Local $array1 = _StringExplode($sRead, " ", 0)
MsgBox(4096, "网吧用户上网信息", "机 号 :" & $array1 & @CRLF & "用户类型:" & $array1 & @CRLF & "上机区域:" & $array1 & @CRLF & "计费类型:" & $array1 & @CRLF & "上机时长:" & $array1 & @CRLF & "卡上余额:" & $array1 & @CRLF & "IP 地址:" & $array1 & @CRLF & "身份证号:" & $array1, 60)
_ArrayDisplay($array1, "StringExplode 0") 本帖最后由 28002673 于 2017-6-16 19:35 编辑
谢谢这位兄弟,我试了下,还是会出错哦!
你试了没问题吗??难道是我AU3版本有问题.. 本帖最后由 28002673 于 2017-6-16 20:07 编辑
.......晕
Local $sFile = @ScriptDir & '\2.txt' 文件名忘记改了。。
测试通过!
谢谢 热心的 zghwelcome 兄弟!!只是还有好多地方看不懂。。只有慢慢消化了。。
回复 4# 28002673
原理是,二进制方式读取,,然后替换二进制00为20,因为NULL在ascii中是00,而一般的空格是20,所以到这里就已经变成你的另一个附件,不带null那个一样的文本了。然后就是正则匹配,就是你自己的那个代码了 回复 5# yamakawa
嗯,经你这样讲解之后就很好理解了。。谢谢! 本帖最后由 28002673 于 2017-6-17 08:53 编辑
回复 2# zghwelcome
哎,可惜我不会,不然的话我就按照zghwelcome兄弟的这个思路专门写一个查找NULL字符和替换NULL字符为空格的UDF出来 …
{:face (280):} 回复zghwelcome
哎,可惜我不会,不然的话我就按照zghwelcome兄弟的这个思路专门写一个查找NULL字符和 ...
28002673 发表于 2017-6-17 08:43 http://www.autoitx.com/images/common/back.gif
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 {:face (427):}学了一招,,,a版正则好牛,,,俺正则不行,,思路也是2楼那哥们一样,,, 没看很懂 学习了
afan 发表于 2017-6-17 11:35 http://www.autoitx.com/images/common/back.gif
A版好厉害啊.....{:face (59):}
但是为了让这个UDF具有更好的适用性,看A版能不能再稍微修改一下。。
第一,这个UDF既能作用于文件,也能直接作用于字符串,可以给UDF加个可选参数。
第二,让这个UDF有一个返回值,来判断指定的文件或字符串是否带有NULL字符,因为NULL字符不可见,有时候判断起来很麻烦。。
不知道说得是否贴切,,望采纳。。 回复 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 本帖最后由 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了。。
不知道思路是否正确,还望指正。。 回复 13# 28002673
仔细看说明,第一个参数已说明,$sFOB 为“文件路径名或二进制字符串”,返回值也跟你的理解一致。
如果代入非二进制的明文字符串,那应该是没有null字符的,那也就没有任何意义了。
页:
[1]