Пакетное создание файлов, целостность последовательности

Обсуждение вопросов автоматизации Total Commander с помощью сторонних программ и скриптовых технологий.

Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер

_Johm
Сообщения: 119
Зарегистрирован: Вс май 14, 2006 20:03

Сообщение _Johm »

Batya
Задача - сравнить два списка и сформировать третий, включающий элементы, существующие во втором списке, но отсутствующие в первом?
Чаще необходимо достроить список не имея полного.

Bomm
..они выводятся "крякозябликами", какую бы кодовую страеницу не выберешь
Такая же проблема.
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

_Johm писал(а):Чаще необходимо достроить список не имея полного.
Т.е. необходимо для списка сформировать другой список, содержащий недостающие в первом списке элементы?
Если так, то сформулируй четкий критерий последовательности.
Правильно я понимаю, что это - последовательность чисел между заданными частями (начало и окончание) элементов списка (имен файлов)?
Как интерпритировать появление в списке элементов, у которых начало и/или окончание не совпадает с заданным?
Нет, я не сплю. Я просто медленно моргаю.
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение 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"
Нет, я не сплю. Я просто медленно моргаю.
_Johm
Сообщения: 119
Зарегистрирован: Вс май 14, 2006 20:03

Сообщение _Johm »

Завидую я вам, скриптописатели! Спасибо, Batya, все отлично работает. Впринципе решений достаточно. Тема раскрыта.

Единственное что хотелось бы в идеале:
создание выходного списка, когда входные данные - выделенные файлы на панели. Плагин Sequences имеет подходящий алгоритм, но, как упомняналось выше, он не умеен сохранять недостающие.
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

_Johm писал(а):создание выходного списка, когда входные данные - выделенные файлы на панели.
При вызове из TC первый параметр - %L.
Нет, я не сплю. Я просто медленно моргаю.
_Johm
Сообщения: 119
Зарегистрирован: Вс май 14, 2006 20:03

Сообщение _Johm »

Тогда надо, автоматизировать:
искать недостающие элементы в выделении с одинаковым количеством символов

выделение:
a01
a02
a04
ab55

обрабатываются только первые три

, плюс автоматом находить prefix и postfix. То есть повторить sequences...
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

_Johm писал(а):обрабатываются только первые три
А почему не последний один? :wink:
Нет, я не сплю. Я просто медленно моргаю.
Аватара пользователя
Вахмурка
Сообщения: 2587
Зарегистрирован: Пн дек 27, 2004 14:47
Откуда: Большая деревня Москва
Контактная информация:

Сообщение Вахмурка »

Batya писал(а):Вообще-то, это была шутка
Вообще-то я понял. И даже попытался пошутить в ответ.
Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

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

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

a5
a02 
a04 
a555
ab55
ab75
ac85
Как определить приставку и окончание?
Нет, я не сплю. Я просто медленно моргаю.
_Johm
Сообщения: 119
Зарегистрирован: Вс май 14, 2006 20:03

Сообщение _Johm »

Batya писал(а):_Johm писал(а):
обрабатываются только первые три

А почему не последний один?
Аааа, потомучто, если бы надо было последний и далее, то выделять надо с другого места.

Это необходимо, чтобы расчеты были проще и с сильно отличающимися группами не началась лавинная генерация "пропущенных".
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

_Johm
Т.е. базовые части надо определять по первому элементу?
А количество цифр в числовых последовательностях всегда одинаковое?
Нет, я не сплю. Я просто медленно моргаю.
_Johm
Сообщения: 119
Зарегистрирован: Вс май 14, 2006 20:03

Сообщение _Johm »

Batya писал(а):А если так:Код:
a5
a02
a04
a555
ab55
ab75
ac85
То, пусть и будет так: ничего не попадет в выходной файл, так как тук и так видно сколько всего, необходимость возникает, когда много однотипных файлов.

PS согласен, конечно, что задачу надо ставить исчерпывающе, но, Batya, любишь вытащить истину из "где-то рядом" поближе.
_Johm
Сообщения: 119
Зарегистрирован: Вс май 14, 2006 20:03

Сообщение _Johm »

Batya писал(а):А количество цифр в числовых последовательностях всегда одинаковое?
Вот тут не знаю. Может быть и разное.

a01
..
a99
a100

может быть и так
--------------------
следующее сообщение от Tol!k
решает проблему с некоректным
отображением русских букв в
окне cmd.exe
||
\/
Последний раз редактировалось _Johm Ср дек 17, 2008 09:37, всего редактировалось 1 раз.
Аватара пользователя
Tol!k
Сообщения: 1727
Зарегистрирован: Вт апр 01, 2008 20:02
Откуда: Арзамас

Сообщение Tol!k »

Я вас перебью (с)
_Johm писал(а):Bomm
..они выводятся "крякозябликами", какую бы кодовую страеницу не выберешь
Такая же проблема.
Какой шрифт у вас в ДОС-окне?
Если "Terminal", то в умолчаниях для cmd.exe смените шрифт на "Lucida Console".
В шрифте "Terminal" нет кодовой страницы 1251
Аватара пользователя
Bomm
Сообщения: 245
Зарегистрирован: Сб янв 15, 2005 14:39
Откуда: Москва

Сообщение Bomm »

Какой шрифт у вас в ДОС-окне?
Спасибо, дошло :oops:
Юрий Бомштейн
Ответить