[已解]文本處理--將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 回复 1# wenquan79
如果文本1中每行的第三部分与文本2对应行的第一部分总是相同的话,直接将文本进行按行拆分,然后接接即可,如果不一定相同,需要比较一下,直到匹配到相同的,再拼接~ 回Annybaby兄,文本1第3部分与文本2的第1部分不是完全一样的,文本2的内容很多,就像数据库一样,但文本1第3栏的内容都能在文本2里找到。 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) 回复 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) 回复 5# wenquan79
首先循环在数组中搜索是比较耗时的,再循环在未FileOpen文件的情况下写入也是非常耗时的。
我在楼上的代码是先用Assign()将之前正则捕获到的数据一一对应的声明赋值一遍,然后一次性正则替换所有数据,所以效率是极高的。至于正则的解释不太好说,只能靠自己理解了。 了解,感谢! 先把2存成数据库,直接到文本1中截出所根据的文本到数据库里找 回复 4# afan
超版 , Assign('~' & $aSR2[$i], $aSR2[$i + 1])中'~'是什么含义? 回复 9# whitehead
以免和正常申明变量冲突(带~字符是不能正常申明变量的) 回复 6# afan
afan 兄,你好! 正表達式太強了,可也太深了,我弄不明白。
再請教一下,可否增加一個功能,如文本1中有,但文本2中沒找到,將其值(文本1第3爛值)寫到文本4,謝謝! 回复 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) 回复 12# afan
afan 兄,你好,加上后面這段后,經測試程式一直跑不完,幫忙看一下,謝謝! 回复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) 回复 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