[已解决]求助 文本文件的处理转成数组数据,可能需要正则的帮忙~~
本帖最后由 kk_lee69 于 2014-5-30 22:47 编辑求助 文本文件的处理转成数组数据,可能需要正则的帮忙~~
有文本文件 格式如附件,需要将数据转成 数组的方式处理
试过 使用 _FileReadToArray是可以将数据拆成 一行一行的
但是 问题来了
0030 4710392771568 一拖净蜂巢式胶棉拖把(双棉头特惠组)B1 6支 150.00 900.00
跟
0050 4710409090453 立体式药材袋16入 6包 15.00 90.00
会找不出原则
因为使用 StringLen想用 固定字符串长度 处理 , 再遇到中文的时候会有问题
AU3 认为中文字的长度是 1 , 但是 再原本的文本文件 , 其实一个中文字占两个英数的大小
这样 一来就很难用 固定长度的方式 取得 中间的产品名称,不知道有没有人有更好的方法可以教教我的,麻烦各位懂得正则的高手了~~~
目前 能夠做到的如下圖
希望 最終 的到的結果 如下圖
你认为你这么提问别人会看懂吗? 至少把你想要的结果给出来嘛! 本帖最后由 fuldho 于 2014-5-27 09:25 编辑
关于StringLen字节读取可以这样处理,只是建议,不是高招
$txt16 = StringToBinary($txt)
;转16进制
$STR = StringTrimLeft($txt16,2)
;删除"0x"
$LEN = StringLen($STR)/2
;除以2
LEN = StringLen(StringTrimLeft(StringToBinary($txt),2))/2 回复 2# 李岸
已補充說明感謝回復 #include <Array.au3>
$hText = @ScriptDir & '\p.txt'
$sContent = FileRead($hText)
MsgBox(262144,'Debug line ~' & @ScriptLineNumber,'Selection:' & @lf & '$sContent' & @lf & @lf & 'Return:' & @lf & $sContent & @lf & @lf & '@Error:' & @lf & @Error) ;### Debug MSGBOX
$a_NameArray = StringRegExp($sContent, '\d{13} (.+)\h{20}', 3)
If Not @error Then
_ArrayDisplay($a_NameArray, 'Debug~~~')
Else
MsgBox(0,'',@error)
EndIf 本帖最后由 骗子 于 2014-5-30 22:03 编辑
笨办法,结果应该和你的图完全一样了
#include <Array.au3>
$txt = StringRegExpReplace(FileRead('p.txt'), '\h+', '|')
$array = StringRegExp($txt, '\V+', 3)
For $i = UBound($array) - 1 To 0 Step -1
$array[$i] = StringTrimLeft($array[$i], 1)
$array[$i] = StringRegExpReplace($array[$i], '订\|货\|单', '订货单')
$array[$i] = StringRegExpReplace($array[$i], '金\|额', '金额')
If StringInStr($array[$i], '________') Or StringInStr($array[$i], '=====') Or $array[$i] = '|' Then _ArrayDelete($array, $i)
Next
Dim $temp
For $i = 0 To UBound($array) - 1
$ta = StringSplit($array[$i], '|', 2)
For $j = 0 To UBound($ta) - 1
$temp[$i][$j] = $ta[$j]
Next
If UBound($ta) = 6 Then
For $j = 0 To 9
$temp[$i][$j] = ''
Next
For $j = 0 To 3
$temp[$i][$j] = $ta[$j]
Next
$temp[$i] = $ta
$temp[$i] = $ta
EndIf
If UBound($ta) = 7 Then
For $j = 0 To 9
$temp[$i][$j] = ''
Next
$temp[$i] = $ta
$temp[$i] = $ta
$temp[$i] = $ta &' '& $ta
$temp[$i] = $ta
$temp[$i] = $ta
$temp[$i] = $ta
EndIf
Next
_ArrayDisplay($temp)
最主要的就是StringRegExpReplace和StringSplit
#include <Array.au3>
$txt = StringRegExpReplace(FileRead('p.txt'), '\h+', '|')
$array = StringRegExp($txt, '\V+', 3)
For $i = UBound($array) - 1 To 0 Step -1
$array[$i] = StringTrimLeft($array[$i], 1)
$array[$i] = StringRegExpReplace($array[$i], '订\|货\|单', '订货单')
$array[$i] = StringRegExpReplace($array[$i], '金\|额', '金额')
If StringInStr($array[$i], '________') Or StringInStr($array[$i], '=====') Or $array[$i] = '|' Then _ArrayDelete($array, $i)
Next
Dim $temp
For $i = 0 To UBound($array) - 1
$ta = StringSplit($array[$i], '|', 2)
If UBound($ta) = 6 Then ;正常商品
For $j = 0 To 3
$temp[$i][$j] = $ta[$j]
Next
$temp[$i] = $ta
$temp[$i] = $ta
ElseIf UBound($ta) = 7 Then ;商品名中有一个空格的
$temp[$i] = $ta
$temp[$i] = $ta
$temp[$i] = $ta & ' ' & $ta
$temp[$i] = $ta
$temp[$i] = $ta
$temp[$i] = $ta
Else
For $j = 0 To UBound($ta) - 1
$temp[$i][$j] = $ta[$j]
Next
EndIf
Next
_ArrayDisplay($temp)
回复 7# 骗子
酷!!可以用太感謝了!!待會來研究一下 程式的邏輯感謝您的幫忙 e 这么高深的东西,小白来露个脸,继续学习。话说楼主的sql实例弄得很好,不知可以深度讲解否{:face (427):} 高深,谢谢楼主提高 高深,谢谢楼主提高
页:
[1]