wenquan79 发表于 2013-1-31 10:58:18

[已解]文本處理--將1文本的特定內容插到另文本指定位置中.

本帖最后由 wenquan79 于 2013-2-18 20:00 编辑

請教怎樣將文本1第3欄的內容從文本2中找到對對應的行并將其對應內容導入文本1,
即想處理成文本3,謝謝!

--------文本1--------------------
─        59YV03W0-VG0A01S        07G003000120        FQ1,PQ10,PQ11,PQ3
S:        59YV03W0-VG0A01S        07G003000110        FQ1,PQ10,PQ11,PQ3
S:        59YV03W0-VG0A01S        07G003000213        FQ1,PQ10,PQ11,PQ3
S:        59YV03W0-VG0A01S        07G003000310        FQ1,PQ10,PQ11,PQ3
S:        59YV03W0-VG0A01S        07G003000510        FQ1,PQ10,PQ11,PQ3
─        59YV03W0-VG0A01S        07G003001120        FQ2,FQ3
S:        59YV03W0-VG0A01S        07G003001110        FQ2,FQ3
S:        59YV03W0-VG0A01S        07G003001211        FQ2,FQ3

----文本2----
07G003000120        05C111-163004
07G003000110        05C111-163005
07G003000213        05C111-163011
07G003000310        05C111-163012
07G003000510        05C111-163013
07G003001120        05C111-163014
07G003001110        05C111-163015
07G003001211        05C111-163016

-------文本3------
─        59YV03W0-VG0A01S        07G003000120        05C111-163004        FQ1,PQ10,PQ11,PQ3
S:        59YV03W0-VG0A01S        07G003000110        05C111-163005        FQ1,PQ10,PQ11,PQ3
S:        59YV03W0-VG0A01S        07G003000213        05C111-163011        FQ1,PQ10,PQ11,PQ3
S:        59YV03W0-VG0A01S        07G003000310        05C111-163012        FQ1,PQ10,PQ11,PQ3
S:        59YV03W0-VG0A01S        07G003000510        05C111-163013        FQ1,PQ10,PQ11,PQ3
─        59YV03W0-VG0A01S        07G003001120        05C111-163014        FQ2,FQ3
S:        59YV03W0-VG0A01S        07G003001110        05C111-163015        FQ2,FQ3
S:        59YV03W0-VG0A01S        07G003001211        05C111-163016        FQ2,FQ3

annybaby 发表于 2013-1-31 12:01:06

回复 1# wenquan79

如果文本1中每行的第三部分与文本2对应行的第一部分总是相同的话,直接将文本进行按行拆分,然后接接即可,如果不一定相同,需要比较一下,直到匹配到相同的,再拼接~

wenquan79 发表于 2013-1-31 13:47:49

回Annybaby兄,文本1第3部分与文本2的第1部分不是完全一样的,文本2的内容很多,就像数据库一样,但文本1第3栏的内容都能在文本2里找到。

afan 发表于 2013-1-31 14:58:45

Local $str1 = FileRead('1.txt')
Local $str2 = FileRead('2.txt')

Local $aSR2 = StringRegExp($str2, '(\S+)\h+(\S+)', 3)
If @Error Then Exit
For $i = 0 To UBound($aSR2) - 1 Step 2
        Assign('~' & $aSR2[$i], $aSR2[$i + 1])
Next
Opt('ExpandVarStrings', 1)
$str1 = StringRegExpReplace($str1, '(?:\S+\h+\S+\h+)(\S+)', '$0      $~$1$')
Local $FO = FileOpen('3.txt', 2 + 8)
FileWrite($FO, $str1)
FileClose($FO)

wenquan79 发表于 2013-1-31 16:13:13

回复 4# afan
感謝Afan兄的代碼,經測試能完美解決,我原使用數組及StringReplace,那速度慢得很,可否幫忙講解一下你的代碼,感謝!

我原來的思路是先將文本1的第3欄分解成1C1.txt, 由1C1.txtr 每行去文本2中找到再寫回文本1,這太慢了。#include<file.au3>
#include<array.au3>
Dim $_file1=@ScriptDir & "\1c1.txt",$_file2=@ScriptDir & "\1.txt",$_file3=@ScriptDir & "\2.txt",$_file4=@ScriptDir & "\datano.txt",$aRecords1,$aRecords2,$aRecords3
_FileReadToArray($_file1,$aRecords1)
_FileReadToArray($_file2,$aRecords2)
_FileReadToArray($_file3,$aRecords3)
For $x=1 To $aRecords1
      $_index=0
                $_index1=0
      If $aRecords1[$x] = "" Then ContinueLoop
      $_index=_ArraySearch($aRecords3, $aRecords1[$x],0,0,0,1)
      If $_index=-1 Then
                FileWriteLine($_file4,$aRecords1[$x])
                               
                Else
                $_index1=_ArraySearch($aRecords2, $aRecords1[$x],0,0,0,1)       
                $aRecords2[$_index1]=StringReplace($aRecords2[$_index1],$aRecords1[$x],$aRecords3[$_index])
                       
                EndIf
                Next
        _FileWriteFromArray($_file2, $aRecords2,1)

afan 发表于 2013-1-31 16:41:46

回复 5# wenquan79


    首先循环在数组中搜索是比较耗时的,再循环在未FileOpen文件的情况下写入也是非常耗时的。

我在楼上的代码是先用Assign()将之前正则捕获到的数据一一对应的声明赋值一遍,然后一次性正则替换所有数据,所以效率是极高的。至于正则的解释不太好说,只能靠自己理解了。

wenquan79 发表于 2013-1-31 17:05:16

了解,感谢!

netegg 发表于 2013-1-31 17:50:54

先把2存成数据库,直接到文本1中截出所根据的文本到数据库里找

whitehead 发表于 2013-1-31 19:24:23

回复 4# afan
    超版 ,    Assign('~' & $aSR2[$i], $aSR2[$i + 1])中'~'是什么含义?

afan 发表于 2013-1-31 19:27:29

回复 9# whitehead


    以免和正常申明变量冲突(带~字符是不能正常申明变量的)

wenquan79 发表于 2013-2-1 11:06:20

回复 6# afan
afan 兄,你好! 正表達式太強了,可也太深了,我弄不明白。
再請教一下,可否增加一個功能,如文本1中有,但文本2中沒找到,將其值(文本1第3爛值)寫到文本4,謝謝!

afan 发表于 2013-2-1 11:23:37

回复 11# wenquan79


    后面加5行Local $str4 = StringRegExpReplace($str1, '(?s).+?(\S+)\h+\$~.+?\$\h+.+?', '$1______')
$str4 = StringRegExpReplace($str4, '(?s)______[^_]+$', '')
$str4 = StringRegExpReplace($str4, '______', @CRLF)
$FO = FileOpen('4.txt', 2 + 8)
FileWrite($FO, $str4)
FileClose($FO)

wenquan79 发表于 2013-2-1 11:48:28

回复 12# afan
afan 兄,你好,加上后面這段后,經測試程式一直跑不完,幫忙看一下,謝謝!

afan 发表于 2013-2-1 11:52:16

回复afan
afan 兄,你好,加上后面這段后,經測試程式一直跑不完,幫忙看一下,謝謝!
wenquan79 发表于 2013-2-1 11:48 http://www.autoitx.com/images/common/back.gif


    不会吧,我这只要10毫秒就跑完了。。。Local $str1 = FileRead('1.txt')
Local $str2 = FileRead('2.txt')

Local $aSR2 = StringRegExp($str2, '(\S+)\h+(\S+)', 3)
If @Error Then Exit
For $i = 0 To UBound($aSR2) - 1 Step 2
        Assign('~' & $aSR2[$i], $aSR2[$i + 1])
Next
Opt('ExpandVarStrings', 1)
$str1 = StringRegExpReplace($str1, '(?:\S+\h+\S+\h+)(\S+)', '$0      $~$1$')
Local $FO = FileOpen('3.txt', 2 + 8)
FileWrite($FO, $str1)
FileClose($FO)

Local $str4 = StringRegExpReplace($str1, '(?s).+?(\S+)\h+\$~.+?\$\h+.+?', '$1______')
$str4 = StringRegExpReplace($str4, '(?s)______[^_]+$', '')
$str4 = StringRegExpReplace($str4, '______', @CRLF)
$FO = FileOpen('4.txt', 2 + 8)
FileWrite($FO, $str4)
FileClose($FO)

wenquan79 发表于 2013-2-1 14:01:49

回复 14# afan
afan 兄:你好!此代碼試還是一樣,同樣是運行后完成不了,卡在下面的地方就不動了。我使用的版本是V3.3.0.0,謝謝!

+>13:59:07 AU3Check ЧΘ:0
>?︽:(3.3.9.4):D:\autoit3\autoit3.exe "D:\autoit3\new\bb.au3"
页: [1] 2
查看完整版本: [已解]文本處理--將1文本的特定內容插到另文本指定位置中.