Что нового

[Данные, строки] Пропущенные номера страниц

IgRo

Знающий
Сообщения
65
Репутация
5
Есть массив номеров страниц
01, 02, 05, 06
как получить пропущенные страницы: 03, 04
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
IgRo

Код:
#include <Array.au3>

$s = ''
$sTring1 = '01,02,05,06,07,09'

$aText1 = StringSplit($sTring1, ',')

For $i = 1 To $aText1[UBound($aText1) - 1]
	If _ArraySearch($aText1, '0' & $i, 1) = -1 Then $s &= '0' & $i & ','
Next
ConsoleWrite(StringTrimRight($s, 1) & @LF)
 
Автор
I

IgRo

Знающий
Сообщения
65
Репутация
5
Спасибо WSWR
немного допилил :smile:
Код:
#include <Array.au3>
$s = ''
$sTring1 = '02,05,06,07,09,12'
$aText1 = StringSplit($sTring1, ',')

For $i = 1 To $aText1[UBound($aText1) - 1]
	$s0= ""
	if $i<10 then $s0='0'
	If _ArraySearch($aText1, $s0&$i, 1) = -1 Then
	  $s &=  $s0&$i & ','
	EndIf
Next
ConsoleWrite(StringTrimRight($s, 1) & @LF)


Существует более сложный случай
01,02,02а,02б,02г,03,04,05б
Пропущены 02в,05,05а :shok:
Может в этом случае с начало буквы заменить цифрами
02а=2.1
02б=2.2
02в=2.3
02г=2.4
и далее искать пропуски ? :stars:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
IgRo,
Код:
Local $sStr = '01,02,05,06,07,09', $sMissed

$iEnd = Int(StringRegExpReplace($sStr, '^.*,', ''))
	For $i = 1 To $iEnd
		$sTmp = StringFormat('%02d', $i)
		If StringInStr($sStr, $sTmp) Then ContinueLoop
		$sMissed &= $sTmp & ','
	Next
ConsoleWrite(StringTrimRight($sMissed, 1) & @LF)
 
Автор
I

IgRo

Знающий
Сообщения
65
Репутация
5
Спасибо madmasles
немного унифицировал
Код:
Local $sMissed
Local $sStr = '002,005,006,007,011'
;Local $sStr = '02,05,06,07,11'

$sEnd=StringRegExpReplace($sStr, '^.*,', '')
$iL=StringLen($sEnd)
$iEnd = Int($sEnd)
    For $i = 1 To $iEnd
        $sTmp = StringFormat('%0'&$iL&'d', $i)
        If StringInStr($sStr, $sTmp) Then ContinueLoop
        $sMissed &= $sTmp & ','
    Next
ConsoleWrite(StringTrimRight($sMissed, 1) & @LF)

Помогите со страницами с буквами
Код:
01,02,02а,02б,02г,03,04,05б
Пропущены 02в,05,05а
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
IgRo [?]
Помогите со страницами с буквами
А почему не считаются пропущенными 01а, 01б, 05в ?
Как узнать у каких номеров могут быть буквы и в каком диапазоне?
 
Автор
I

IgRo

Знающий
Сообщения
65
Репутация
5
А почему не считаются пропущенными 01а, 01б, 05в ?
Как узнать у каких номеров могут быть буквы и в каком диапазоне?

Диапазон по последней букве или её отсутствии
например у 01 нет буквы считаем, что страницы 01а нет (утверждение вероятностное).
02,02а,02б,02г диапазон от 02 до 02г (02, 02а, 02б, 02в, 02г)
05б диапазон от 05 до 05б (05, 05а, 05б)


Добавлено:
Сообщение автоматически объединено:

ГОСТ 2.503-90
При добавлении нового листа документа допускается присваивать ему номер предыдущего листа с добавлением очередной строчной буквы русского алфавита или через точку арабской цифры, например 3а или 3.1. При этом на первом (заглавном) листе изменяют общее количество листов.


Спасибо InnI за вопрос по диапазонам :smile:
который навёл на мысль действовать с конца и

Код:
$sStr = '01,02,02а,02б,02г,03,04,05б'
$sStr = StringReplace($sStr,"а",".1")
$sStr = StringReplace($sStr,"б",".2")
$sStr = StringReplace($sStr,"в",".3")
$sStr = StringReplace($sStr,"г",".4")
$sStr = StringReplace($sStr,"д",".5")
$aStr = StringSplit($sStr, ',')
$sMissed=""
$iGrupaStr=$aStr[$aStr[0]]
For $i=$aStr[0] To 1 Step -1
	$fStr=Number($aStr[$i])
	if $iGrupaStr<$fStr Then ContinueLoop
	$iGrupaStr=Int($fStr)
	While $fStr >= $iGrupaStr
		$sMissed = $fStr  & ',' & $sMissed
		$fStr = $fStr - 0.1
	WEnd
Next
$sMissed = StringReplace($sMissed,".1","а")
$sMissed = StringReplace($sMissed,".2","б")
$sMissed = StringReplace($sMissed,".3","в")
$sMissed = StringReplace($sMissed,".4","г")
$sMissed = StringReplace($sMissed,".5","д")

ConsoleWrite(StringTrimRight($sMissed, 1) & @LF)


Получаем порядок страниц без пропуска
Код:
1,2,2а,2б,2в,2г,3,4,5,5а,5б
осталось сравнить
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
IgRo
Пробуйте
Код:
$String = "01,02,02а,02б,02г,03,04,05б"
$Missed = ""

$Array = StringSplit($String, ",")

For $i = 1 To $Array[0]
  If Number($Array[$i]) <= 0 Then
    ConsoleWrite("Некорректный формат строки" & @CRLF)
    Exit
  EndIf
Next

$i = 1
While Number($Array[1]) <> $i
  $Missed &= StringFormat("%.2d", $i) & ","
  $i += 1
WEnd
$GroupNumber = $i

$i = 1
While $i <= $Array[0]
  $Group = ""
  Do
    $Group &= $Array[$i] & ","
    $i += 1
    If $i > $Array[0] Then ExitLoop
  Until $GroupNumber <> Number($Array[$i])

  While Number(StringLeft($Group, 2)) <> $GroupNumber
    $Missed &= StringFormat("%.2d", $GroupNumber) & ","
    $GroupNumber += 1
  WEnd

  $tmp = StringLeft($Group, 2)
  If Not StringInStr($Group,  $tmp & ",") Then $Missed &= $tmp & ","
  $delta = Asc(StringRight($Group, 2)) - 224
  For $j = 0 To $delta
    If Not StringInStr($Group, $tmp & Chr(224 + $j)) Then $Missed &= $tmp & Chr(224 + $j) & ","
  Next

  $GroupNumber += 1
WEnd
ConsoleWrite(StringTrimRight($Missed, 1) & @CRLF)

Или так (без проверки формата исходной строки)
Код:
$String = "01а,02,02а,02б,02г,03,04,05б,08б,09,12в"
$Missed = ""

$tmp = StringRegExp($String, "\d{2}[а-я]*$", 3)
$Last = Number($tmp[0])

For $i = 1 To $Last
  $Fmt = StringFormat("%.2d", $i)
  $Array = StringRegExp($String, $Fmt & "(,|$)", 3)
  If @error = 1 Then $Missed &= $Fmt & ","
  $Array = StringRegExp($String, $Fmt & "[а-я]", 3)
  If @error = 1 Then ContinueLoop
  $tmp = ""
  For $j = 0 To UBound($Array) - 1
    $tmp &= $Array[$j] & ","
  Next
  $delta = Asc(StringRight($Array[UBound($Array) - 1], 1)) - 224
  For $j = 0 To $delta
    If Not StringInStr($tmp, $Fmt & Chr(224 + $j)) Then $Missed &= $Fmt & Chr(224 + $j) & ","
  Next
Next

ConsoleWrite(StringTrimRight($Missed, 1) & @CRLF)
 
Верх