Что нового

Найти одинаковые строки в txt

kpohoc25

Новичок
Сообщения
1
Репутация
0
подскажите пожалуйста как найти одинаковые строки в двух разных файлах
файл 1 - 1.txt
файл 2 - 2.txt
и вывести одинаковые строки в out.txt
файлы большие по 500мб.
на форуме искал но не нашел. Заранее очень благодарен
 

Andrey_A

Продвинутый
Сообщения
325
Репутация
68
Тестировал на небольших файлах, как там будет на больших не знаю, но принцип известный
Код:
$sFile1='D:\Name1.txt'
$sFile2='D:\Name2.txt'
$sResult=_Same_Lines_2_File($sFile1,$sFile2)
MsgBox(4096,'Переменная $sResult',$sResult)

$sFileSave='C:\out.txt'
_Same_Lines_2_File_SaveFile($sFile1,$sFile2,$sFileSave)

Func _Same_Lines_2_File($sFile1,$sFile2,$iRegistr=1,$sDelim=@CRLF)
  Local $oDict=ObjCreate('Scripting.Dictionary'),$aRet=FileReadToArray($sFile1),$k=0,$sText=''
  $oDict.RemoveAll
  $oDict.CompareMode=$iRegistr
  For $i In $aRet
    $oDict.Item($i)=-2
  Next
  $oDict.Item('')=2
  $aRet=FileReadToArray($sFile2)
  For $i In $aRet
    $oDict.Item($i)+=1
    If -1=$oDict.Item($i)Then
      $sText&=$i&$sDelim
      $k+=1
    EndIf
  Next
  Return $k ? SetError(0,$k,StringTrimRight($sText,StringLen($sDelim))):''
EndFunc

Func _Same_Lines_2_File_SaveFile($sFile1,$sFile2,$sFileSave,$iRegistr=1,$sDelim=@CRLF)
  Local $oDict=ObjCreate('Scripting.Dictionary'),$aRet=FileReadToArray($sFile1),$k=0,$sText=''
  $oDict.RemoveAll
  $oDict.CompareMode=$iRegistr
  For $i In $aRet
    $oDict.Item($i)=-2
  Next
  $oDict.Item('')=2
  $aRet=FileReadToArray($sFile2)
  For $i In $aRet
    $oDict.Item($i)+=1
    If -1=$oDict.Item($i)Then
      $sText&=$i&$sDelim
      $k+=1
    EndIf
  Next
  $hFile=FileOpen($sFileSave,138) ; 128+8+2
  FileWrite($hFile,$sText)
  FileClose($hFile)
EndFunc

Сообщение автоматически объединено:

Появился ещё вариант, без объекта 'Scripting.Dictionary'. Реализуется через MAP переменную.
Что быстрее Dictionary или MAP я не тестировал...
(кстати сайт не подсвечивает функции MAP: MapExists() и др.)

Код:
$sFile1='D:\Name1.txt'
$sFile2='D:\Name2.txt'
$sResult=_Map_Same_Lines_2_File($sFile1,$sFile2)
MsgBox(4096,'Переменная $sResult',$sResult)

$sFileSave='C:\out.txt'
_Map_Same_Lines_2_File_SaveFile($sFile1,$sFile2,$sFileSave)

#include <Array.au3>
$aResult=_Map_Same_Lines_2_File_Array($sFile1,$sFile2)
_ArrayDisplay($aResult)

Func _Map_Same_Lines_2_File($sFile1,$sFile2,$sDelim=@CRLF)
  Local $aRet=FileReadToArray($sFile1),$sText='',$mMap[]
  For $i In $aRet
    $mMap[$i]=-2
  Next
  $aRet=FileReadToArray($sFile2)
  For $i In $aRet
    $mMap[$i]+=1
    If -1=$mMap[$i]Then $sText&=$i&$sDelim
  Next
  Return StringTrimRight($sText,StringLen($sDelim))
EndFunc

Func _Map_Same_Lines_2_File_SaveFile($sFile1,$sFile2,$sFileSave,$sDelim=@CRLF)
  Local $aRet=FileReadToArray($sFile1),$sText='',$mMap[]
  For $i In $aRet
    $mMap[$i]=-2
  Next
  $aRet=FileReadToArray($sFile2)
  For $i In $aRet
    $mMap[$i]+=1
    If -1=$mMap[$i]Then $sText&=$i&$sDelim
  Next
  $hFile=FileOpen($sFileSave,138) ; 128+8+2
  FileWrite($hFile,$sText)
  FileClose($hFile)
EndFunc

Func _Map_Same_Lines_2_File_Array($sFile1,$sFile2)
  Local $aRet=FileReadToArray($sFile1),$mMap[],$mRes[]
  For $i In $aRet
    $mMap[$i]=''
  Next
  $aRet=FileReadToArray($sFile2)
  For $i In $aRet
    If MapExists($mMap,$i)Then $mRes[$i]=''
  Next
  Return MapKeys($mRes)
EndFunc
 
Последнее редактирование:
Верх