Страница 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 писал(а):обрабатываются только первые три
А почему не последний один? :wink:

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

Добавлено: Вт дек 16, 2008 18:38
Batya
Вахмурка писал(а):И даже попытался пошутить в ответ.
:oops: Ну, извини :D
Просто я ждал нормального описания задачи, вот и не уловил юмора.
_Johm писал(а):a01
a02
a04
ab55
А если так:

Код: Выделить всё

a5
a02 
a04 
a555
ab55
ab75
ac85
Как определить приставку и окончание?

Добавлено: Вт дек 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
Какой шрифт у вас в ДОС-окне?
Спасибо, дошло :oops: