Что нового

Доработать скрипт для удаления дубликатов из двух файлов

roman82101

Новичок
Сообщения
18
Репутация
1
Был замечен очень хороший скрипт для удаления дубликатов из двух файлов. :laugh: Только он не умеет работать с большими файлами (один 250 Мб. второй 85 Мб.) и это плохо :( хотелось бы его доработать. :IL_AutoIt_1:

Код:
; Script Start - Add your code below here

#include <File.au3>

$sFilePath1 = @ScriptDir & '\file1.txt' ; путь до 1 файла
$sFilePath2 = @ScriptDir & '\file2.txt' ; путь до 2 файла
$sFilePath3 = @ScriptDir & '\file3.txt' ; путь до 3 файла

Global $aT1, $k = 0

_FileReadToArray($sFilePath1, $aT1)
$sText = FileRead($sFilePath2)
Local $aT3[$aT1[0]]

For $i = 1 To $aT1[0]
	If Not StringInStr($sText, $aT1[$i]) Then
		$aT3[$k] = $aT1[$i]
		$k += 1
	EndIf
Next

ReDim $aT3[$k]

_FileWriteFromArray($sFilePath3, $aT3)
;Скрипт пишет результат в 3-й текстовый файл
 

AZJIO

Меценат
Меценат
Сообщения
2,892
Репутация
1,196
Re: [Массивы] Доработать скрипт

roman82101
StringInStr разве проверяет дубликаты?

Посмотри это http://autoit-script.ru/index.php?topic=4861.0
это Scripting.Dictionary
Compare strings.

Кстати 250 Мб является просто проблемой недостатка памяти. На один процесс 2Гб. На самом деле в памяти файл занимает на много больше места. Он преобразуется в юникод, ещё умнож на 2 и того (250+80)*2 = 660 Мб. При экспорте этого всего в массив выделяется ещё 660 Мб. При наполнении ещё 3-го массива для него ещё выделяется 660 Мб. И того 2 Гб достигнуто.
 
Автор
roman82101

roman82101

Новичок
Сообщения
18
Репутация
1
Re: [Массивы] Доработать скрипт

програмка не работает, скрипты как и мой работают не много и без результата закрываются, оперативы 4 Гб из них примерно 2.7 Гб свободно
раз на то пошло, то есть скрипт который удаляет строки больше указанного числа символов, как сделать так чтоб было наоборот - удалял которые меньше
Код:
FileWrite(@ScriptDir&'\out.txt',StringRegExpReplace(FileRead(@ScriptDir&'\in.txt'),'.{8,}','\1'))
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: [Массивы] Доработать скрипт

roman82101,

Предупреждение За нарушение правил форума (пункт Б.5):
Имя темы должно нести смысловую нагрузку (отражать суть вопроса/проблемы)
Правильно сформулированное название темы привлекает больше внимания, и шансы получить конкретный ответ увеличиваются.


Данные правила могут пополняться локальными правилами раздела.
Как правильно называть темы

"[Массивы] Доработать скрипт" - это неприемлемое название темы, переименуйте тему иначе она будет закрыта, а вам возможно будет выдан бан на несколько дней.

С уважением, ваш Глобальный модератор.
 

AZJIO

Меценат
Меценат
Сообщения
2,892
Репутация
1,196
roman82101
1. Назвать тему: "Удаление дубликатов строк из двух файлов", остальные слова излишни, тут все скрипты и все дорабатываются.
2. Используй StringRegExp, чтобы вернуть массив нужных строк (с флагом 3), приблизительный шаблон '(?m)^.{8,}$'. У вас не указана версия AutoIt ни в теме ни в подписи, для старой и новой версии есть отличия в регулярных выражениях.
3. И кстати можно загрузить меньший файл в память, а больший читать по 20 Мб с обрезая по переносу строк и возвращая указатель в файле назад на обрезанную величину и сравнивать его текущие строки с загруженным массивом.
 
Верх