找回密码
 加入
搜索
查看: 8687|回复: 11

[AU3基础] [已解决]求助 文本文件的处理转成数组数据,可能需要正则的帮忙~~

  [复制链接]
发表于 2014-5-26 23:49:38 | 显示全部楼层 |阅读模式
本帖最后由 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 , 但是 再原本的文本文件 , 其实一个中文字占两个英数的大小

这样 一来就很难用 固定长度的方式 取得 中间的产品名称,不知道有没有人有更好的方法  可以教教我的,麻烦各位懂得正则的高手了~~~



目前 能夠做到的  如下圖



希望 最終 的到的結果 如下圖

本帖子中包含更多资源

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

×
发表于 2014-5-27 05:02:33 | 显示全部楼层
你认为你这么提问别人会看懂吗? 至少把你想要的结果给出来嘛!
发表于 2014-5-27 09:23:20 | 显示全部楼层
本帖最后由 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
 楼主| 发表于 2014-5-27 10:57:43 | 显示全部楼层
回复 2# 李岸

已補充說明  感謝回復
发表于 2014-5-27 18:15:25 | 显示全部楼层
#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:02:14 | 显示全部楼层
本帖最后由 骗子 于 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[UBound($array)][10]
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][5] = $ta[4]
                $temp[$i][7] = $ta[5]
        EndIf        
        If UBound($ta) = 7 Then
                For $j = 0 To 9
                        $temp[$i][$j] = ''
                Next
                $temp[$i][0] = $ta[0]
                $temp[$i][1] = $ta[1]
                $temp[$i][2] = $ta[2] &' '& $ta[3]
                $temp[$i][3] = $ta[4]
                $temp[$i][5] = $ta[5]
                $temp[$i][7] = $ta[6]
        EndIf        
Next
_ArrayDisplay($temp)

本帖子中包含更多资源

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

×
发表于 2014-5-30 22:08:38 | 显示全部楼层
最主要的就是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[UBound($array)][10]
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][5] = $ta[4]
                $temp[$i][7] = $ta[5]
        ElseIf UBound($ta) = 7 Then ;商品名中有一个空格的
                $temp[$i][0] = $ta[0]
                $temp[$i][1] = $ta[1]
                $temp[$i][2] = $ta[2] & ' ' & $ta[3]
                $temp[$i][3] = $ta[4]
                $temp[$i][5] = $ta[5]
                $temp[$i][7] = $ta[6]
        Else
                For $j = 0 To UBound($ta) - 1
                        $temp[$i][$j] = $ta[$j]
                Next
        EndIf
Next
_ArrayDisplay($temp)

评分

参与人数 1金钱 +60 收起 理由
kk_lee69 + 60

查看全部评分

 楼主| 发表于 2014-5-30 22:46:34 | 显示全部楼层
回复 7# 骗子

酷!!  可以用  太感謝了!!  待會來研究一下 程式的邏輯  感謝您的幫忙
发表于 2014-5-31 12:21:49 | 显示全部楼层
e 这么高深的东西,小白来露个脸,继续学习。话说楼主的sql实例弄得很好,不知可以深度讲解否
发表于 2014-6-2 16:32:41 | 显示全部楼层
高深,谢谢楼主提高
发表于 2014-6-2 16:32:47 | 显示全部楼层
高深,谢谢楼主提高
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-30 03:24 , Processed in 0.075004 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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