Что нового

Извлечь строки по списку

Сообщения
60
Репутация
-2
Привет. Такая задача.
Вот у меня есть файл C:\111.txt. В нём надо найти определённые строки, которые присутствуют в файле-списке C:\222.txt.
И вывести эти строки в файл C:\Output.txt
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Примеры файлов дайте
 
Автор
Parazit
Сообщения
60
Репутация
-2
Файл C:\111.txt
Код:
111
222
fff
333
aaa
bbb
444

Файл C:\222.txt
Код:
111
ggg
333
hhh
jjj

Соответственно, файл C:\Output.txt должен быть таким.

Код:
111
333
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Путь только исправьте на свой, я рядом со скриптом файлы создал :
Код:
#include <File.au3>

Local $aArray1, $aArray2
Local $aResult[0]

$sFile1 = @ScriptDir & '/1.txt'
$sFile2 = @ScriptDir & '/2.txt'

_FileReadToArray($sFile1, $aArray1)
_FileReadToArray($sFile2, $aArray2)

$n = 0
For $i = 1 To $aArray1[0]
	For $y = 1 To $aArray2[0]
		If $aArray1[$i] = $aArray2[$y] Then
			$n += 1
			ReDim $aResult[$n]
			$aResult[$n - 1] = $aArray1[$i]
			ExitLoop
		EndIf
	Next
Next

_FileWriteFromArray(@ScriptDir & '/Output.txt', $aResult)
 
Автор
Parazit
Сообщения
60
Репутация
-2
Спасибо. Великолепно работает.

ra4o, а не могли бы вы сделать, чтобы в файл выводились различия?
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Так в файл и выводится , смотри строку
Код:
_FileWriteFromArray(@ScriptDir & '/Output.txt', $aResult)

создаётся файл результата "Output.txt" в дирректории со скриптом.
Или я не о том? Вам нужны в файле не совпадения а различия ?
 
Автор
Parazit
Сообщения
60
Репутация
-2
Ну, да. Сначала у меня была задача найти совпадения, но теперь задача изменилась, и теперь надо найти различия.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Добавил в функцию переключатель $diff : true (по умолчанию) возвращает массив различающихся элементов, false - совпадающих
Код:
Func _ArrayCompare(Const ByRef $a1, Const ByRef $a2, $diff = True)
  If UBound($a1, 0) <> 1 Or UBound($a2, 0) <> 1 Then Return
  Local $sLine = ""
  For $i = 0 To UBound($a1) - 1
    For $j = 0 To UBound($a2) - 1
      If $a1[$i] = $a2[$j] Then
        If Not $diff And Not StringInStr($sLine, $a1[$i]) Then $sLine &= $a1[$i] & "|"
        ExitLoop
      EndIf
    Next
    If $diff And $j = UBound($a2) Then $sLine &= $a1[$i] & "|"
  Next
  Return StringSplit(StringTrimRight($sLine, 1), "|", 2)
EndFunc
 
Автор
Parazit
Сообщения
60
Репутация
-2
Массив, это конечно, хорошо, но как должен выглядить окончательный вариант скрипта,
который выводит строки, которые отсутсвуют в файле C:\111.txt, но которые присутствуют в файле C:\222.txt?

Файл C:\111.txt
Код:
111
222
fff
333
aaa
bbb
444

Файл C:\222.txt
Код:
111
ggg
333
hhh
jjj

Соответственно, файл C:\Output.txt должен быть таким.

Код:
ggg
hhh
jjj
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Так ?
Код:
#include <File.au3>
#include <Array.au3>

Local $aArray1, $aArray2
Local $aResult[0]

$sFile1 = @ScriptDir & '/1.txt'
$sFile2 = @ScriptDir & '/2.txt'

_FileReadToArray($sFile1, $aArray1)
_FileReadToArray($sFile2, $aArray2)

$n = 0
For $i = 1 To $aArray2[0]
	If _ArraySearch($aArray1, $aArray2[$i]) < 0 Then
		$n += 1
		ReDim $aResult[$n]
		$aResult[$n - 1] = $aArray2[$i]
	EndIf
Next

_FileWriteFromArray(@ScriptDir & '/Output.txt', $aResult)
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Parazit
которые отсутсвуют в файле C:\111.txt, но которые присутствуют в файле C:\222.txt
Код:
#include <File.au3>
_FileWriteFromArray("Output.txt", _ArrayCompare(FileReadToArray("222.txt"), FileReadToArray("111.txt")))
 
Автор
Parazit
Сообщения
60
Репутация
-2
InnI, спасибо. Ваш скрипт тоже работает.
 
Верх