Страница 2 из 3
Добавлено: Вт дек 16, 2008 13:25
_Johm
Batya
Задача - сравнить два списка и сформировать третий, включающий элементы, существующие во втором списке, но отсутствующие в первом?
Чаще необходимо достроить список не имея полного.
Bomm
..они выводятся "крякозябликами", какую бы кодовую страеницу не выберешь
Такая же проблема.
Добавлено: Вт дек 16, 2008 13:54
Batya
_Johm писал(а):Чаще необходимо достроить список не имея полного.
Т.е. необходимо для списка сформировать другой список, содержащий недостающие в первом списке элементы?
Если так, то сформулируй четкий критерий последовательности.
Правильно я понимаю, что это - последовательность чисел между заданными частями (начало и окончание) элементов списка (имен файлов)?
Как интерпритировать появление в списке элементов, у которых начало и/или окончание не совпадает с заданным?
Добавлено: Вт дек 16, 2008 14:48
Batya
Из того, что пока понял по задаче, слепил vbs-скрипт:
Код: Выделить всё
'==============================================================================
' Формирование списка отсутствующих в последовательности элементов
'==============================================================================
Option Explicit
'===== Изменяемые параметры ===================================================
Dim InFile, OutFile, Prefix, Postfix
With WScript
InFile = .Arguments(0)
OutFile = .Arguments(1)
Prefix = .Arguments(2)
Postfix = .Arguments(3)
End With
'==============================================================================
Dim Dic, FSO, List, l, i, m, Str, LenPrefix, LenPostfix
Set Dic = CreateObject("Scripting.Dictionary")
Set FSO = CreateObject("Scripting.FileSystemObject")
LenPrefix = Len(Prefix)
LenPostfix = Len(Postfix)
List = FSO.OpenTextFile(InFile).ReadAll
For Each l In Split(List, vbNewLine)
If (UCase(Left(l, LenPrefix )) = UCase(Prefix )) And _
(UCase(Right(l, LenPostfix)) = UCase(Postfix)) Then
m = CInt(Mid(l, LenPrefix + 1, Len(l) - LenPrefix - LenPostfix))
Dic.Add m, l
End If
Next
For i = Min(Dic.Keys) To Max(Dic.Keys)
If Not Dic.Exists(i) Then
Str = Str & vbNewLine & prefix & i & postfix
End If
Next
Str = Mid(Str, Len(vbNewLine) + 1)
FSO.CreateTextFile(OutFile, True).Write Str
Quit
Function Max(pArr)
Dim lE, lM
lM = pArr(0)
For Each lE In pArr
If lE > lM Then lM = lE
Next
Max = lM
End Function
Function Min(pArr)
Dim lE, lM
lM = pArr(0)
For Each lE In pArr
If lE < lM Then lM = lE
Next
Min = lM
End Function
Sub Quit
Set Dic = Nothing
Set FSO = Nothing
WScript.Quit
End Sub
Скрипт запускается с четырьмя параметрами:
1 - исходный список-последовательность,
2 - выходной список-последовательность,
3 - начало элемента,
4 - окончание элемента.
Например:
Код: Выделить всё
"existing_files.txt" "missing_files.txt" "str _" "_ end.test"
Добавлено: Вт дек 16, 2008 16:46
_Johm
Завидую я вам, скриптописатели! Спасибо, Batya, все отлично работает. Впринципе решений достаточно. Тема раскрыта.
Единственное что хотелось бы в идеале:
создание выходного списка, когда входные данные - выделенные файлы на панели. Плагин Sequences имеет подходящий алгоритм, но, как упомняналось выше, он не умеен сохранять недостающие.
Добавлено: Вт дек 16, 2008 17:12
Batya
_Johm писал(а):создание выходного списка, когда входные данные - выделенные файлы на панели.
При вызове из TC первый параметр - %L.
Добавлено: Вт дек 16, 2008 18:16
_Johm
Тогда надо, автоматизировать:
искать недостающие элементы в выделении с одинаковым количеством символов
выделение:
a01
a02
a04
ab55
обрабатываются только первые три
, плюс автоматом находить prefix и postfix. То есть повторить sequences...
Добавлено: Вт дек 16, 2008 18:19
Batya
_Johm писал(а):обрабатываются только первые три
А почему не последний один?

Добавлено: Вт дек 16, 2008 18:31
Вахмурка
Batya писал(а):Вообще-то, это была шутка
Вообще-то я понял. И даже попытался пошутить в ответ.
Добавлено: Вт дек 16, 2008 18:38
Batya
Вахмурка писал(а):И даже попытался пошутить в ответ.

Ну, извини
Просто я ждал нормального описания задачи, вот и не уловил юмора.
_Johm писал(а):a01
a02
a04
ab55
А если так:
Как определить приставку и окончание?
Добавлено: Вт дек 16, 2008 18:39
_Johm
Batya писал(а):_Johm писал(а):
обрабатываются только первые три
А почему не последний один?
Аааа, потомучто, если бы надо было последний и далее, то выделять надо с другого места.
Это необходимо, чтобы расчеты были проще и с сильно отличающимися группами не началась лавинная генерация "пропущенных".
Добавлено: Вт дек 16, 2008 18:41
Batya
_Johm
Т.е. базовые части надо определять по первому элементу?
А количество цифр в числовых последовательностях всегда одинаковое?
Добавлено: Вт дек 16, 2008 18:50
_Johm
Batya писал(а):А если так:Код:
a5
a02
a04
a555
ab55
ab75
ac85
То, пусть и будет так: ничего не попадет в выходной файл, так как тук и так видно сколько всего, необходимость возникает, когда много однотипных файлов.
PS согласен, конечно, что задачу надо ставить исчерпывающе, но, Batya, любишь вытащить истину из "где-то рядом" поближе.
Добавлено: Вт дек 16, 2008 18:59
_Johm
Batya писал(а):А количество цифр в числовых последовательностях всегда одинаковое?
Вот тут не знаю. Может быть и разное.
a01
..
a99
a100
может быть и так
--------------------
следующее сообщение от Tol!k
решает проблему с некоректным
отображением русских букв в
окне cmd.exe
||
\/
Добавлено: Вт дек 16, 2008 21:46
Tol!k
Я вас перебью (с)
_Johm писал(а):Bomm..они выводятся "крякозябликами", какую бы кодовую страеницу не выберешь
Такая же проблема.
Какой шрифт у вас в ДОС-окне?
Если "Terminal", то в умолчаниях для cmd.exe смените шрифт на "Lucida Console".
В шрифте "Terminal" нет кодовой страницы 1251
Добавлено: Ср дек 17, 2008 10:11
Bomm
Какой шрифт у вас в ДОС-окне?
Спасибо, дошло
