[已解决]正则运用 文本文件的处理汇出 希望给个思路看看该怎么处理 感谢
本帖最后由 kk_lee69 于 2012-2-14 16:29 编辑小弟有个很多个文本文件如附件
//-------------------------------------//
// 生效日:880625 0.00.00ACP2-003.SDD //
//-------------------------------------//
档案代码:ACPTA
文件名:应付凭单单头档
类 型:3 (1.主档单头 2.主档单身 3.交易单头 4.交易单身 5.事务历史记录 6.月檔/统计 7.系统文件 8.其它)
转档完成:Y
PRIMARY :TA001+TA002
INDEX01 :TA003+TA001+TA002
INDEX02 :TA004+TA003
===============================================================================================
序号 字段代号 域名 TYPE 长度备注
===============================================================================================
0001 TA001 凭单单别 C 4 应付凭单单别
0002 TA002 凭单单号 C 11 应付凭单单号
0003 TA003 凭单日期 C 8 凭单日期
0004 TA004 供应厂商 C 10 供应厂商代号
0005 TA005 厂别 C 6 厂别
0006 TA006 统一编号 C 20 统一编号&&871006del_ta007 //890623 MODI BY 349 C8->C20
0007 TA008 币别 C 4 币别
0008 TA009 汇率 N 7.4 汇率
我想把这些文本文件的内容汇出成 EXCEL 的格式
档案代码文件名类型PRIMARYINDEX01INDEX02序号字段代号 域名 TYPE长度 备注
请教高手该怎么处理 可以利用正则抓取到我想要的信息呢??
====================================================================
檔案代碼:(\w+)
檔案名稱:(.+)
類 型:(\d+)
這三個 可以抓到 前面三個資料....... 但是 後面
PRIMARY 跟 INDEX01 的部分因為有的只有 一個 PRIMARY 有的有三個 PRIMARY 跟 INDEX01 跟 INDEX02
就有點亂七八糟了 呵呵 建议先(?s)码:.+?(?=档案代|$)分成相同格式的大段,再细分,否则就算匹配出来了也不好整理出属于哪个部分,容易出错 回复 2# afan
好主意.... 呵呵我還在想怎麼紀錄...到底哪個表 是哪些欄位勒....
分成細部的話....應該會比較好處理我試看看 呵呵 Local $str = FileRead('A1.txt')
Local $sTt = '档案代码|文件名|类型|PRIMARY|INDEX01|INDEX02'
Local $aSS = StringSplit($sTt, '|', 2)
Local $sOut = ''
Local $aSR0 = StringRegExp($str, '(?s)码:.+?(?=档案代|$)', 3) ;分成相同格式的大段
For $i = 0 To UBound($aSR0) - 1
$sOut &= '[档案 ' & $i + 1 & ']' & @CRLF
Local $aSR1 = StringRegExp($aSR0[$i], '(?s).+(?=\v+\=)|.+', 3) ;再分割两部分
If UBound($aSR1) < 2 Then ContinueLoop
Local $aSR2 = StringRegExp($aSR1, '(?<!成):(\V+)', 3) ;提取:部分
For $ii = 0 To UBound($aSR2) - 1
$sOut &= $aSS[$ii] & ' = ' & $aSR2[$ii] & @CRLF
Next
Local $aSR3 = StringRegExp($aSR1, '(\d+)\h+(\w+\d+)\h+(\H+)\h+(\w)\h+(\d+\.?\d*)\h+(\V+)', 3) ;提取:序号等
If UBound($aSR3) < 6 Then ContinueLoop
Local $x = 1
For $iii = 0 To UBound($aSR3) - 5 Step 6
$sOut &= $x & '序号 = ' & $aSR3[$iii] & @CRLF
$sOut &= $x & '字段代号 = ' & $aSR3[$iii + 1] & @CRLF
$sOut &= $x & '域名 = ' & $aSR3[$iii + 2] & @CRLF
$sOut &= $x & 'TYPE = ' & $aSR3[$iii + 3] & @CRLF
$sOut &= $x & '长度 = ' & $aSR3[$iii + 4] & @CRLF
$sOut &= $x & '备注 = ' & $aSR3[$iii + 5] & @CRLF
$x += 1
Next
$sOut &= @CRLF
Next
Local $sFile = 'testA.ini'
FileDelete($sFile)
FileWrite($sFile, $sOut)
ShellExecute($sFile) 回复 4# afan
果然是 Afan 老大正則真是太強了.....每次都可以學到東西......
可以請教一下嗎
(?s)碼:.+?(?=檔案代|$)這段語法裡面的 ?=檔案代|$意思是 只匹配 檔案代 這幾個字之前或者是結尾的意思嗎?? (?=檔案代|$) 意思是匹配后面是“檔案代” 或者“末尾”位置的意思
也就是从“碼:”一直到后面是“檔案代” 或者“末尾”位置 回复 6# afan
用意其實都可以了解 重點是 怎麼轉為 正則的語法......
譬如 我寫成(?s)碼:.+檔案代?
本來的用意是要以 檔案代結束但是跑出來卻不能分成兩個.......而且還多比對了一個 一行叫做檔案的
碼:ACPTB
檔案名稱:應付憑單單身檔
類 型:4 (1.主檔單頭 2.主檔單身 3.交易單頭 4.交易單身 5.交易記錄 6.月檔/統計 7.系統檔 8.其它)
轉檔完成:Y
PRIMARY :TB001+TB002+TB003
INDEX01 :TB005+TB006
===============================================================================================
序號 欄位代號 欄位名稱 TYPE 長度備註
===============================================================================================
0001 TB001 憑單單別 C 4 應付憑單單別
0002 TB002 憑單單號 C 11 應付憑單單號
~~刪~~
檔案代碼:ACPTC
檔案
果然 還是得多練習才會變成慣例才會了解 大概怎樣類型的要用怎樣的語法才可以是正確的 高手出招果然不一样,学习中 A版的正则功夫真是了不得啊,看了几遍还没看懂。 不懂这东东,学习下了啊谢谢
页:
[1]