[已解決]如何做到从文本文件读取数据依照长度放入数组又不可以改变文字排列格式??
本帖最后由 kk_lee69 于 2011-11-16 23:00 编辑有個文字檔案 內容如下:
SIC25-2-TP08 50 PCS 總部-檢驗倉-存貨送檢到貨
SIC53-1-TC11 50 PCS 總部-檢驗倉-存貨送檢到貨
SCK3950-C 50 PCS 總部-檢驗倉-存貨送檢到貨
SCK4965-C 34 PCS 總部-檢驗倉-存貨送檢到貨
SCK4965-C 33 PCS 到貨 總部-檢驗倉-存貨送檢
ER16-1/8mm-A 109 PCS 到貨 總部-成品倉-1OO
ER20-6mm-A 353 PCS 到貨 總部-成品倉-1OO
ER20-7mm 1000 PCS 到貨 總部-成品倉-1OO
ER16-1.5mm 29 PCS 到貨 總部-成品倉-1OO
ER16-2.5mm 200 PCS 到貨 總部-成品倉-1OO
ER16-4.5mm 142 PCS 到貨 總部-成品倉-1OO
ER16-5.5mm 53 PCS 到貨 總部-成品倉-1OO
ER16-6.5mm 100 PCS 到貨 總部-成品倉-1OO
ER16-8.5mm 100 PCS 到貨 總部-成品倉-1OO
EOC32B-10 2 PCS 到貨 總部-成品倉-1OO
文字檔案內容大小不一定................上面指示舉個例子........ 如何 依照長度 區分成數個字符串 放入 數組中,但是 又不可以破壞掉一行
我的方法是 用 @CRLF 先去判斷他的位置,由於需要1000左右區分一段.....所以當 @CRLF 位置 大於900 小於 1000 就分段
可是這樣我寫不出循環 可以把整個檔案分好放到數組裡面.............
希望高手 可以幫幫忙........ 用正则,一行代码搞定~#include <Array.au3>
Local $Max = 220 ;--------只需指定最大长度
Local $Str = _
'SIC25-2-TP08 50 PCS 總部-檢驗倉-存貨送檢到貨' & @CRLF & _
'SIC53-1-TC11 50 PCS 總部-檢驗倉-存貨送檢到貨' & @CRLF & _
'SCK3950-C 50 PCS 總部-檢驗倉-存貨送檢到貨' & @CRLF & _
'SCK4965-C 34 PCS 總部-檢驗倉-存貨送檢到貨' & @CRLF & _
'SCK4965-C 33 PCS 到貨 總部-檢驗倉-存貨送檢' & @CRLF & _
'ER16-1/8mm-A 109 PCS 到貨 總部-成品倉-1OO ' & @CRLF & _
'ER20-6mm-A 353 PCS 到貨 總部-成品倉-1OO ' & @CRLF & _
'ER20-7mm 1000 PCS 到貨 總部-成品倉-1OO ' & @CRLF & _
'ER16-1.5mm 29 PCS 到貨 總部-成品倉-1OO ' & @CRLF & _
'ER16-2.5mm 200 PCS 到貨 總部-成品倉-1OO ' & @CRLF & _
'ER16-4.5mm 142 PCS 到貨 總部-成品倉-1OO ' & @CRLF & _
'ER16-5.5mm 53 PCS 到貨 總部-成品倉-1OO ' & @CRLF & _
'ER16-6.5mm 100 PCS 到貨 總部-成品倉-1OO ' & @CRLF & _
'ER16-8.5mm 100 PCS 到貨 總部-成品倉-1OO ' & @CRLF & _
'EOC32B-10 2 PCS 到貨 總部-成品倉-1OO'
MsgBox(0, '原字符串', $Str)
Local $Test = StringRegExp($str, '(?s)(?<=\n|^)(.{1,' & $Max & '}|.*)(?=\r|$)', 3)
If @Error Then Exit(MsgBox(48, @Error, '无法分段')
_ArrayDisplay($Test, UBound($Test))
;-----------以下可查看具体结果
Local $i, $Out = ''
For $i = 0 To UBound($Test) - 1
$Out &= $Test[$i] & @CRLF & '=============================' & @CRLF
Next
Msgbox(64, '分 ' & UBound($Test) & ' 段结果', $Out)
回复 2# afan
真是神奇的正則感謝 afan 老大的幫忙 回复 3# kk_lee69
21行下面插一行纠错,判断最大值过小的问题If StringLen($Test) > $Max Then Exit(MsgBox(48, '错误', '最大长度过小,无法分段')) 回复 4# afan
收到......
不知道是不是有人願意解釋 下面的語法翻譯成中文的話到底怎麼解釋呢..... 剛剛去查過了 有些 寫法找不到解釋@@
(?s)(?<=\n|^)(.{1,220}|.*)(?=\r|$)
(?s) ==> 指的是任意匹配包括換行
(?<=\n|^) ==> (?<=exp)匹配exp后面的位置,所以EXP應該是指\n|^ ,\n 指的是匹配換行符 (@LF, chr(10)). 但是|^ 不懂意思有人可以告訴一下嗎??
(.{1,220}|.*) ===> 這個老實說 找不到資料 搞不懂意思
(?=\r|$) ===> (?=exp)断言自身出现的位置的后面能匹配表达式exp,所以 EXP 部分應該是 \r|$ ,\r匹配一個回車 (@CR, chr(13)),|$這個部分又看不懂了 呵呵 但是 |^ 不懂意思有人可以告訴一下嗎??
kk_lee69 发表于 2011-11-16 22:32 http://www.autoitx.com/images/common/back.gif
“|”是或的意思;“^”是字符串开头的意思。“|^”就是“或者匹配字符串开头”
(.{1,220}|.*) ===> 這個老實說 找不到資料 搞不懂意思
kk_lee69 发表于 2011-11-16 22:32 http://www.autoitx.com/images/common/back.gif
最外面的“()”表示输出组
. 表示任意字符
{} 里面的内容就是指它前面的表达式要达到多少个,有逗号的话就是“最少多少,最多多少”
.{1,220} 就是指任意字符要达到1个以上,220个以下
“|”是或的意思;“.*”是指任意个任意字符
连到一起解释为:任意字符要达到1个以上,220个以下 或 任意个。之所以要“任意个”是因为前面取完之后,剩下的那点可能不足数,就靠“|.*”拿下。当然这里不存在这个现象,因为最小长度我设为1,都属于“.{1,220}”能够吃到的范围,如果你改为“.{150,220}”就不一定了,可能就需要“|.*”拿下。
|$這個部分又看不懂了
kk_lee69 发表于 2011-11-16 22:32 http://www.autoitx.com/images/common/back.gif
“|”是或的意思;“$”与“^”刚好相反,它是匹配字符串尾部。
以上就是本人的粗略解释,至少我写的时候就是这么理解的。
正则的解释既繁琐又枯燥,所以一般只有靠自己琢磨~ 本帖最后由 kk_lee69 于 2011-11-16 23:12 编辑
回复 6# afan
多謝啦 多謝幫忙^^
幫助很大的 感謝 又见神奇的正则!
受益非浅啊!
页:
[1]