Фиксация дубликатов строк и их контролируемое удаление

Krakatau

Новый пользователь
Сообщения
8
Реакции
0
Нужен скрипт который указывает повторяющиеся строки, возле строк которые дублируются- будет стоять число повторений. После вручную удалить лишние дубликаты строк в тексте- с указанием номеров удаленных строк (опасность удаления дубликатов привязанных к другим значениям-на сайтах, на которых регистрировал свою почту- указал ее, потому в тексте они дублируются).
Что то подобное ReplaceByRegular.vbs с файлом Replace - log(только круче) куда(в папку) будет вставлен нужный текст:Hi:
 
Последнее редактирование:
Приветствую!
О каком примерном числе строк идёт речь? Может вам на C# подойдет?
Я как раз не так давно себе нечто подобное делал.
Файл UniqueMaker.exe забираете из папки bin/Relelease, кладете его в папку рядом с файлами *.txt или *.log, запускаете, в поле Minimum repeats указываете минимальное число повторов, которое интересует (остальные будут удалены вообще), жмёте "Make Unique", рядом будет создана папка "Unique" с теми же файлами в формате "Число повторений # Уникальная строка".

1716528934166.webp

1716528956171.webp
 

Вложения

Приветствую!
О каком примерном числе строк идёт речь? Может вам на C# подойдет?
Я как раз не так давно себе нечто подобное делал.
Файл UniqueMaker.exe забираете из папки bin/Relelease, кладете его в папку рядом с файлами *.txt или *.log, запускаете, в поле Minimum repeats указываете минимальное число повторов, которое интересует (остальные будут удалены вообще), жмёте "Make Unique", рядом будет создана папка "Unique" с теми же файлами в формате "Число повторений # Уникальная строка".

Посмотреть вложение 109195
Посмотреть вложение 109196
 
С удовольствием и уважением читаю ответы всеми уважаемых экспертов, тем более ваш ответ- почти молниеносный.Пробовал установить вашу программу, но у меня возникла маленькая проблема. Я внесу ясность в мой вопрос и положение. У меня система Майкрософт Windows 10 Корпоративная 2016 с долгосрочным обслуживанием- Windows 10 x32 10.0.14393 - не воспринимает .Net Framework 4.8.1, который требуется для установки и запуска вашей программы- по удалению дубликатов строк. Я надеюсь что у человека с золотой головой и руками, еще есть что мне предложить, с моими скромными возможностями и незнанием языка, юзать что то попроще- языков программирования.Можно что то готовое- exe, bat, ps1, vbs,тем более вам легко дается, а для меня будет приятно дальше находиться(приходить) на сайте, где управляет такой талант как вы и много замечательных,талантливых програмистов и также участвовать-отвечать,ставить отметки согласно моему уровню ума и такта.
 
Предпосылка моего вопроса(не из праздного любопытства),а из необходимости навести порядок в своих записях, которые храню как свой банковский счет и кошелек( которые истекают в такие тяжелые времена).
Есть текстовый документ в формате txt, куда вносились все мои адреса-аккаунты и пароли.

почта- ***************
пароль- *************
потом другие адреса привязанные с другими аккаутами,котрые в перемешку повторяются с вышеуказанным сайтом.
и снова
почта- ***************
пароль- *************
В результате должно получиться:
Номер строк которые повторяются и сколько раз повторяются. Потом ручками, каждую удаляем через REGEX.
Проблема состоит в том что при автоматическом удалении- удаляются ценные адреса и привязанные ники и пароли.
Без человеческого фактора- невозможен искусственный интеллект.
 
Спасибо за лестный отзыв.
У меня система Майкрософт Windows 10 Корпоративная 2016 с долгосрочным обслуживанием- Windows 10 x32 10.0.14393 - не воспринимает .Net Framework 4.8.1
Да вроде не должно быть такого ограничения. А что пишет установщик при попытке поставить Download .NET Framework 4.8.1 Web Installer ?

Вот честно, про пароли лучше бы не писали. А то потом можно и обвинение получить в наш адрес. Будто, запустил вашу программу, и у меня пароли украли. Разумеется, чисто гипотетически.

В этом случае, чтобы обезопасить себя, предоставлю открытым текстом VBScript:
VB.NET / VBA:
'
' Скрипт создания отчёта о дубликатах строк (кол-во повторов + номера строк)
' (c) Dragokas
'
' Использование: duplicates-checker.vbs <file>
'
Option Explicit
dim oFSO, oShell, cur, ver, fileResult, fileSource, oDict, sContent
dim opt_minDuplicates, opt_CodePage, opt_ResultFileName

ver = "1.0"

'----------- НАСТРОЙКИ ----------

' минимальное кол-во повторов, которые нужно учитывать (при меньшем кол-ве они не попадут в лог)
opt_minDuplicates = 2

' кодировка исходного файла
opt_CodePage = "utf-8"

' имя файла для сохранения результата
opt_ResultFileName = "report_duplicates.csv"

'--------------------------------

Const SplitterNumLines = "*"
Const SplitterColumns = ";"

Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oShell = CreateObject("WScript.Shell")
set oDict = CreateObject("Scripting.Dictionary")

if WScript.Arguments.Count = 0 then Using: WScript.Quit 1

fileSource = WScript.Arguments(0)

' чтение
On Error Resume Next
sContent = ReadTextFile(fileSource, opt_CodePage)
if Err.Number <> 0 then WScript.Echo "Error reading file: " & fileSource & vbNewLine & "Error = " & Err.Number & " (" & Err.Description & ")": WScript.Quit 1
On Error Goto 0

' куда записывать результат
cur = oFSO.GetParentFolderName(WScript.ScriptFullName)
fileResult = oFSO.BuildPath(cur, opt_ResultFileName)

' парсинг
dim arr, i, sLex
sContent = Replace(sContent, vbCr, "")
arr = Split(sContent, vbLf)
sContent = ""

for i = 0 to Ubound(arr)
    sLex = SanitizeLex(arr(i))
    if not oDict.Exists(sLex) then 'поиск повторов
        oDict.Add sLex, cstr(i+1) 'запись номера строки
    else
        oDict(sLex) = oDict(sLex) & SplitterNumLines & cstr(i+1)
    end if
next

' отбор и запись результатов
sContent = "Repeats" & SplitterColumns & "Line numbers" & SplitterColumns & "Content" & vbNewLine
dim vKey, vNumLines, iNumLines
for each vKey in oDict.Keys
    vNumLines = Split(oDict(vKey), SplitterNumLines)
    iNumLines = UBound(vNumLines) + 1
    if iNumLines >= opt_minDuplicates then
        sContent = sContent & iNumLines & SplitterColumns & oDict(vKey) & SplitterColumns & vKey & vbNewLine
    end if
next

WriteTextFile fileResult, sContent, opt_CodePage
WScript.Quit 0

function SanitizeLex(lex)
    SanitizeLex = Trim(lex)
end function

sub Using()
    WScript.Echo "Using: " & vbNewLine & _
        WScript.ScriptName & " ""path\file.txt"""
end sub

function ReadTextFile(path, charset)
    Dim objStream
    Set objStream = CreateObject("ADODB.Stream")
    objStream.CharSet = charset
    objStream.Open
    objStream.LoadFromFile(path)
    ReadTextFile = objStream.ReadText()
    objStream.Close
    Set objStream = Nothing
end function

function WriteTextFile(path, strData, charset)
    Dim objStream
    Set objStream = CreateObject("ADODB.Stream")
    objStream.Open
    objStream.CharSet = charset
    objStream.Type = 2 'adTypeText
    objStream.Position = 0
    objStream.WriteText strData
    objStream.SaveToFile path, 2 'adSaveCreateOverWrite
    objStream.Close
    Set objStream = Nothing
end function
Использование: сохранить код в файл duplicates-checker.vbs и перетащить проверяемый файл поверх данного файла скрипта.
Отчёт в виде файла report_duplicates.csv можно открыть, например, через Excel и увидеть в форме подобной этой:
1716621767196.webp
 
Номер строк которые повторяются и сколько раз повторяются. Потом ручками, каждую удаляем через REGEX.
Проблема состоит в том что при автоматическом удалении- удаляются ценные адреса и привязанные ники и пароли.
Без человеческого фактора- невозможен искусственный интеллект.
Вообще, выглядит немного странноватым занятие - отдать программе искать дубликаты, чтобы потом опять самому искать дубликаты.
Я бы сделал иначе, например, через Excel визуализировал бы такие строки и рядом указал якорные гиперссылки с возможностью перехода на любой из дубликатов, чтобы затем уже ручками что-то там делать и не искать самому.
Вот макрос VBA, который делает выше-обозначенное:

VB.NET / VBA:
Option Explicit

'обрабатываемый файл
Const opt_ProcessingFile = "H:\_VBS, WSH\DuplicatesChecker\test.txt"

'кодировка файла
Const opt_Charset = "utf-8"

'минимальное число повторов для отображения
Const opt_minDuplicates = 2

Private Function GetRandomColor() As Long
    Static prevIndex As Long
    Dim rndIndex As Long
    Dim listColors 'наиболее заметные цвета для глаза, с комфортно читаемым текстом на их фоне (не слишком светлые и не слишком тёмные)
    listColors = Array(3, 4, 6, 7, 8, 10, 12, 14, 16, 17, 18, 20, 22, 24, 26, 27, 28, 33, 36, 37, 38, 39, 40, 42, 43, 44, 45, 46, 48, 50)
    rndIndex = Int(rnd() * (UBound(listColors) + 1))
    If rndIndex = prevIndex Then 'предотвратить повторение цвета
        GetRandomColor = GetRandomColor()
    Else
        GetRandomColor = listColors(rndIndex)
        prevIndex = rndIndex
    End If
End Function

Function ReadTextFile(path As String, charset As String, out_Text As String) As Boolean
    On Error GoTo ErrH:
    Dim objStream As Object
    Set objStream = CreateObject("ADODB.Stream")
    objStream.charset = charset
    objStream.Open
    objStream.LoadFromFile (path)
    out_Text = objStream.ReadText()
    objStream.Close
    ReadTextFile = True
    Exit Function
ErrH:
    MsgBox "Error: " & Err.Number & " - " & Err.Description
End Function

Function PrintFile(path As String, charset As String, out_NumLines As Long) As Boolean
    Dim sContent As String
    If (ReadTextFile(path, charset, sContent)) Then
        Dim arr, i&
        sContent = Replace$(sContent, vbCr, vbNullString)
        arr = Split(sContent, vbLf)
        For i = 0 To UBound(arr)
            With Cells(i + 1, 1)
                .NumberFormat = "@"
                .Value = arr(i)
            End With
        Next
        out_NumLines = UBound(arr) + 1
        PrintFile = True
    End If
End Function

Function SanitizeLex(lex As String) As String
    SanitizeLex = Trim(lex)
End Function

Private Sub CreateHyperlinks(y As Long, ColumnStartIdx As Long, aNumLines)
    Dim i As Long, x As Long, nLineNumber As Long
    For i = 0 To UBound(aNumLines)
        x = ColumnStartIdx + i
        nLineNumber = aNumLines(i)
        Dim txt As String
        txt = "{" & CStr(nLineNumber) & "}"
        ActiveSheet.Hyperlinks.Add Anchor:=Cells(y, x), Address:="", SubAddress:= _
            Cells(nLineNumber, 1).Address, TextToDisplay:=txt
    Next
End Sub

Public Sub ShowDuplicates()
    Const ColumnLinksStart As String = "H"
    Const SplitterNumLines As String = "*"

    If (MsgBox("Информация с текущей страницы Excel будет стерта" & vbNewLine & "Продолжить?", vbQuestion + vbYesNo) = vbNo) Then Exit Sub
    Cells.Clear
    
    'читаем файл
    Dim numLines As Long
    If (Not PrintFile(opt_ProcessingFile, opt_Charset, numLines)) Then Exit Sub
    
    Dim oDict As Object
    Set oDict = CreateObject("Scripting.Dictionary")
    
    'парсинг
    Dim y As Long, sLex As String
    For y = 1 To numLines
        sLex = SanitizeLex(Cells(y, 1))
        If (Len(sLex) <> 0) Then
            If Not oDict.Exists(sLex) Then 'поиск повторов
                oDict.Add sLex, CStr(y) 'запись номера строки
            Else
                oDict(sLex) = oDict(sLex) & SplitterNumLines & CStr(y)
            End If
        End If
    Next
    
    ' отбор и выделение результатов
    Dim vKey, vNumLines, iNumLines&, iColor&, i&, k&, x&, RA As Range, ColumnStartIdx As Long
    ColumnStartIdx = Columns(ColumnLinksStart).Column
    For Each vKey In oDict.Keys
        vNumLines = Split(oDict(vKey), SplitterNumLines)
        iNumLines = UBound(vNumLines) + 1
        If iNumLines >= opt_minDuplicates Then
            iColor = GetRandomColor()
            For i = 0 To UBound(vNumLines)
                Set RA = Cells(CLng(vNumLines(i)), 1)
                ' подсвечиваем дубликаты одним цветом
                RA.Interior.ColorIndex = iColor
                ' создаём якорные гиперссылки на строки дубликатов
                Call CreateHyperlinks(RA.Row, ColumnStartIdx, vNumLines)
            Next
        End If
    Next
    
End Sub
Использование: Excel -> Alt + F8, написать имя макроса ShowDuplicates -> создать -> заменить все на код, приложенный выше, сохранить.
В строчке Const opt_ProcessingFile = "H:\_VBS, WSH\DuplicatesChecker\test.txt" заменить на полный путь к вашему файлу.
Закрыть редактор кода. Нажать Alt + F8, выбрать макрос "ShowDuplicates" -> Выполнить.
Предварительно, потребуется разрешить запуск макросов в Excel.
Готовый Excel файл приложен.
Гиперссылки, разумеется, кликабельны.
1716628037347.png
 

Вложения

Последнее редактирование:
Вообще, выглядит немного странноватым занятие - отдать программе искать дубликаты, чтобы потом опять самому искать дубликаты.
Я понял что мне нужно(оффлайн программу или скрипт- vbs, bat, exe ps1): в интернете нашел калькуляторы подсчета одинаковых строк- с цифрами подсчета повторений возле строк которые повторяются.Не могу доверять онлайн проверкам свои аккаунты и пароли,которые были разбросаны по всем папкам компьютера(долго объяснять ситуации)-без использования хранения паролей и собралось много таких изменяющихся файлов очень много и собрав и соединил, я хочу подсчитать повторения и удалять вручную,так как не доверяю программам которые(как слон в посудной лавке) могут безвозвратно удалить,то что я годами собрал и хранил ценную информацию.
 
@Krakatau, на 6-й пост ответите пожалуйста?
P.S. А вообще, уже не нужно, разобрался: .NET Framework system requirements - .NET Framework
У вас 14393 - это 1607. Максимально поддерживаемая Net Framework 4.8.

Что в итоге, 2 скрипта которые выложил выше, подошли? Разобрались как ими пользоваться?
 
Последнее редактирование:
Что в итоге, 2 скрипта которые выложил выше, подошли? Разобрались как ими пользоваться?
За труд благодарю, конечно для вас это все легко (не умаляет ваши старания) - как игра, а для меня некоторые мелочи недоступны ,бывают критические дни судорожного поиска, когда мозг не хочет работать и потому... я долго не мог адекватно проверить и вас поблагодарить. Вы гений! Тут вы собрали подобных себе- это прекрасно, что есть такой сайт.
Скрипт UniqueMaker.exe не понимает кирилицу,но это не проблема потому что основной файл остается целым.Это как раз то что я давно безуспешно искал(недостаточно) на просторах инета и у вас нашел, большое спасибо!
А вот со скопированными скриптами у меня возникла проблема - выдает ошибку синтаксиса.
01.webp
 
Скрипт UniqueMaker.exe не понимает кирилицу,но это не проблема потому что основной файл остается целым.Это как раз то что я давно безуспешно искал(недостаточно) на просторах инета и у вас нашел, большое спасибо!
Исходные файлы обработки должны быть сохранены в формате UTF-8.
А вот со скопированными скриптами у меня возникла проблема - выдает ошибку синтаксиса.
Думаю, вы спутали макрос VBA для Excel (пост 7) со скриптом VBS (пост 6).
Видимо в сборке которую я установил блокирует установку Net Framework 4.8.1.
Блокирует, т.к. не поддерживает.
 
Вы меня раскусили, ведь я всячески избегал перехода с обычного текста на ЭКСЕЛЬ, хотя выполнял на нем несколько операций по параллельному тексту (двух- язычный текст с двумя языками). Видимо нужно плотно заняться работе на ЭКСЕЛЬ - перспективное и много обещающее направление и на нем можно больше функций и операций. Раньше я занимался переводом программ на русский язык, и много чего... что обычный пользователь не делает. Я знаю что VBA для Excel,но думал проехать на кривой козе, ведь я раньше знал что эти (VBA и VBS) как бы "братья", только для разных направлений. Мне всегда нравились ваши ответы и поправки, не стесняйтесь и впредь.
Я запомнил(это важно)"Исходные файлы обработки должны быть сохранены в формате UTF-8."
 
Последнее редактирование:
Назад
Сверху Снизу