Что нового

[Данные, строки] Заменить сокращения в строках

IgRo

Знающий
Сообщения
65
Репутация
5
На входе строки с сокращениями
Код:
$sString ='303610 Цепи /'&@CRLF
$sString&='303611 - грузовые пластинчатые'&@CRLF
$sString&='303612 - тяговые пластинчатые'&@CRLF
$sString&='303613 - тяговые разборные'&@CRLF
$sString&='303614 - тяговые вильчатые'&@CRLF
$sString&='303615 - приводные зубчатые'&@CRLF
$sString&='303616 - приводные роликовые, втулочные'&@CRLF
$sString&='303617 - якорные'&@CRLF
$sString&='303618 - транспортные пластинчатые для стеклянной тары'&@CRLF
$sString&='303619 - прочие'&@CRLF
$sString&='303620 Звенья цепей'&@CRLF
$sString&='303621 - кроме кулачков, траков / соединительные'&@CRLF
$sString&='303622 - переходные'&@CRLF
$sString&='303623 Кулачки'&@CRLF
$sString&='303624 Траки'&@CRLF
$sString&='303629 Звенья цепей прочие'&@CRLF
$sString&='303630 Канаты, тросики, балансиры'&@CRLF
$sString&='303631 Канаты без дополнительных элементов / пеньковые'&@CRLF
$sString&='303632 - полимерные'&@CRLF
$sString&='303633 - металлические'&@CRLF
$sString&='303634 Канаты с дополнительными элементами'&@CRLF
$sString&='303635 Тросики'&@CRLF
$sString&='303636 Балансиры'&@CRLF
$sString&='303640 Ремни /'&@CRLF
$sString&='303641 - плоские'&@CRLF
$sString&='303642 - зубчатые'&@CRLF
$sString&='303643 - круглые'&@CRLF
$sString&='303644 - клиновые'&@CRLF
$sString&='303649 - прочие'&@CRLF
$sString&='303650 Устройства включения и переключения'&@CRLF
$sString&='303651 Механизмы / педальные'&@CRLF
$sString&='303652 - кнопочные'&@CRLF
$sString&='303653 - клавишные'&@CRLF
$sString&='303654 - с ручками'&@CRLF
$sString&='303655 - комбинированные'&@CRLF
$sString&='303656 Маховички, штурвалы'&@CRLF
$sString&='303657 Замыкатели, размыкатели'&@CRLF
$sString&='303658 Рукоятки, ручки'&@CRLF
$sString&='303659 Кнопки, клавший, педали, контакты'&@CRLF
$sString&='303660 Шкивы для ремней, блоки, шпиндели'&@CRLF
$sString&='303661 Шкивы для ремней / плоских'&@CRLF
$sString&='303662 - зубчатых'&@CRLF
$sString&='303663 - круглых'&@CRLF
$sString&='303664 - клиновых'&@CRLF
$sString&='303665 Блоки'&@CRLF
$sString&='303666 Шпиндели'&@CRLF
$sString&='303670 Рычаги'&@CRLF
$sString&='303671 Рычаги без вилок / одноплечие'&@CRLF
$sString&='303672 - двухплечие'&@CRLF
$sString&='303673 - трехплечие я более'&@CRLF
$sString&='303674 Рычаги с вилками / одноплечие'&@CRLF
$sString&='303675 - двухплечие'&@CRLF
$sString&='303676 - трехдлечие и более'
На выходе нужно сокращения убрать
 
Автор
I

IgRo

Знающий
Сообщения
65
Репутация
5
Re: [RegExp] Заменить сокращения в строках

Например из
303610 Цепи /
303611 - грузовые пластинчатые

303620 Звенья цепей
303621 - кроме кулачков, траков / соединительные
303622 - переходные


получить
303610 Цепи
303611 Цепи грузовые пластинчатые

303620 Звенья цепей
303621 Звенья цепей кроме кулачков, траков соединительные
303622 Звенья цепей кроме кулачков, траков переходные
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Re: [RegExp] Заменить сокращения в строках

Ну, без регулярных выражений это довольно просто делается
Код:
$sString ='303610 Цепи /'&@CRLF
$sString&='303611 - грузовые пластинчатые'&@CRLF
$sString&='303612 - тяговые пластинчатые'&@CRLF
$sString&='303613 - тяговые разборные'&@CRLF
$sString&='303614 - тяговые вильчатые'&@CRLF
$sString&='303615 - приводные зубчатые'&@CRLF
$sString&='303616 - приводные роликовые, втулочные'&@CRLF
$sString&='303617 - якорные'&@CRLF
$sString&='303618 - транспортные пластинчатые для стеклянной тары'&@CRLF
$sString&='303619 - прочие'&@CRLF
$sString&='303620 Звенья цепей'&@CRLF
$sString&='303621 - кроме кулачков, траков / соединительные'&@CRLF
$sString&='303622 - переходные'&@CRLF
$sString&='303623 Кулачки'&@CRLF
$sString&='303624 Траки'&@CRLF
$sString&='303629 Звенья цепей прочие'&@CRLF
$sString&='303630 Канаты, тросики, балансиры'&@CRLF
$sString&='303631 Канаты без дополнительных элементов / пеньковые'&@CRLF
$sString&='303632 - полимерные'&@CRLF
$sString&='303633 - металлические'&@CRLF
$sString&='303634 Канаты с дополнительными элементами'&@CRLF
$sString&='303635 Тросики'&@CRLF
$sString&='303636 Балансиры'&@CRLF
$sString&='303640 Ремни /'&@CRLF
$sString&='303641 - плоские'&@CRLF
$sString&='303642 - зубчатые'&@CRLF
$sString&='303643 - круглые'&@CRLF
$sString&='303644 - клиновые'&@CRLF
$sString&='303649 - прочие'&@CRLF
$sString&='303650 Устройства включения и переключения'&@CRLF
$sString&='303651 Механизмы / педальные'&@CRLF
$sString&='303652 - кнопочные'&@CRLF
$sString&='303653 - клавишные'&@CRLF
$sString&='303654 - с ручками'&@CRLF
$sString&='303655 - комбинированные'&@CRLF
$sString&='303656 Маховички, штурвалы'&@CRLF
$sString&='303657 Замыкатели, размыкатели'&@CRLF
$sString&='303658 Рукоятки, ручки'&@CRLF
$sString&='303659 Кнопки, клавший, педали, контакты'&@CRLF
$sString&='303660 Шкивы для ремней, блоки, шпиндели'&@CRLF
$sString&='303661 Шкивы для ремней / плоских'&@CRLF
$sString&='303662 - зубчатых'&@CRLF
$sString&='303663 - круглых'&@CRLF
$sString&='303664 - клиновых'&@CRLF
$sString&='303665 Блоки'&@CRLF
$sString&='303666 Шпиндели'&@CRLF
$sString&='303670 Рычаги'&@CRLF
$sString&='303671 Рычаги без вилок / одноплечие'&@CRLF
$sString&='303672 - двухплечие'&@CRLF
$sString&='303673 - трехплечие я более'&@CRLF
$sString&='303674 Рычаги с вилками / одноплечие'&@CRLF
$sString&='303675 - двухплечие'&@CRLF
$sString&='303676 - трехдлечие и более'

$aString = StringSplit($sString, @CRLF, 1)

$resString = ""
$head = ""

For $i=1 To UBound($aString)-1
	$numString = StringLeft($aString[$i],7)
	$tmpString = StringTrimLeft($aString[$i],7)
	$pos = StringInStr($tmpString,"-")
	If $pos > 0 Then
		$tmpString = $head & StringTrimLeft($tmpString,$pos)
	Else
		$head = ""
	EndIf
	$pos = StringInStr($tmpString,"/")
	If $pos > 0 Then
		$head = StringLeft($tmpString,$pos-2)
		$tmpString = StringReplace($tmpString," /","")
	EndIf
	$resString &= $numString & $tmpString & @CRLF
Next

ConsoleWrite(@CR&$resString&@CR)

Даже не представляю как такое можно сделать с регулярными выражениями. Если кто осилит, то очень хотелось бы посмотреть.

Преобразование из
303620 Звенья цепей
303621 - кроме кулачков, траков / соединительные
303622 - переходные


в
303620 Звенья цепей
303621 Звенья цепей кроме кулачков, траков соединительные
303622 Звенья цепей кроме кулачков, траков переходные


я считаю явной ошибкой.

Потому что в случае, например, входных данных
303640 Ремни
303641 - плоские
303642 - зубчатые

Что тогда должно быть на выходе в третьей строке?
Ремни зубчатые или Ремни плоские зубчатые ?
 

mef-t

Осваивающий
Сообщения
306
Репутация
30
Re: [RegExp] Заменить сокращения в строках

Прошу прощения, старался сделать первым, но не успел.
Код:
#include <String.au3>
#include <Array.au3>

$sString ='303610 Цепи /'&@CRLF
$sString&='303611 - грузовые пластинчатые'&@CRLF
$sString&='303612 - тяговые пластинчатые'&@CRLF
$sString&='303613 - тяговые разборные'&@CRLF
$sString&='303614 - тяговые вильчатые'&@CRLF
$sString&='303615 - приводные зубчатые'&@CRLF
$sString&='303616 - приводные роликовые, втулочные'&@CRLF
$sString&='303617 - якорные'&@CRLF
$sString&='303618 - транспортные пластинчатые для стеклянной тары'&@CRLF
$sString&='303619 - прочие'&@CRLF
$sString&='303620 Звенья цепей'&@CRLF
$sString&='303621 - кроме кулачков, траков / соединительные'&@CRLF
$sString&='303622 - переходные'&@CRLF
$sString&='303623 Кулачки'&@CRLF
$sString&='303624 Траки'&@CRLF
$sString&='303629 Звенья цепей прочие'&@CRLF
$sString&='303630 Канаты, тросики, балансиры'&@CRLF
$sString&='303631 Канаты без дополнительных элементов / пеньковые'&@CRLF
$sString&='303632 - полимерные'&@CRLF
$sString&='303633 - металлические'&@CRLF
$sString&='303634 Канаты с дополнительными элементами'&@CRLF
$sString&='303635 Тросики'&@CRLF
$sString&='303636 Балансиры'&@CRLF
$sString&='303640 Ремни /'&@CRLF
$sString&='303641 - плоские'&@CRLF
$sString&='303642 - зубчатые'&@CRLF
$sString&='303643 - круглые'&@CRLF
$sString&='303644 - клиновые'&@CRLF
$sString&='303649 - прочие'&@CRLF
$sString&='303650 Устройства включения и переключения'&@CRLF
$sString&='303651 Механизмы / педальные'&@CRLF
$sString&='303652 - кнопочные'&@CRLF
$sString&='303653 - клавишные'&@CRLF
$sString&='303654 - с ручками'&@CRLF
$sString&='303655 - комбинированные'&@CRLF
$sString&='303656 Маховички, штурвалы'&@CRLF
$sString&='303657 Замыкатели, размыкатели'&@CRLF
$sString&='303658 Рукоятки, ручки'&@CRLF
$sString&='303659 Кнопки, клавший, педали, контакты'&@CRLF
$sString&='303660 Шкивы для ремней, блоки, шпиндели'&@CRLF
$sString&='303661 Шкивы для ремней / плоских'&@CRLF
$sString&='303662 - зубчатых'&@CRLF
$sString&='303663 - круглых'&@CRLF
$sString&='303664 - клиновых'&@CRLF
$sString&='303665 Блоки'&@CRLF
$sString&='303666 Шпиндели'&@CRLF
$sString&='303670 Рычаги'&@CRLF
$sString&='303671 Рычаги без вилок / одноплечие'&@CRLF
$sString&='303672 - двухплечие'&@CRLF
$sString&='303673 - трехплечие я более'&@CRLF
$sString&='303674 Рычаги с вилками / одноплечие'&@CRLF
$sString&='303675 - двухплечие'&@CRLF
$sString&='303676 - трехдлечие и более'

$array = _StringExplode($sString, @CRLF, 0)

$mainEl=''
$replace = True
for $i=0 To UBound($array)-1
	If StringInStr($array[$i], '/') > 0 Or (StringInStr($array[$i], '-') = 0) Then
		$replace = True
	Else
		$replace = False
	EndIf

	If StringInStr($array[$i], '-') > 0 Then
		$array[$i] = StringReplace($array[$i], '-', $mainEl)
	EndIf
	If $replace Then $mainEl=$array[$i]
	If StringInStr($mainEl, ' /') > 0 Then
		$mainEl=StringLeft($mainEl, StringInStr($mainEl, ' /')-1 )
	EndIf
	if StringIsDigit(StringLeft($mainEl, 1)) = 1 Then	$mainEl=StringTrimLeft($mainEl, StringInStr($mainEl, ' '))
	$array[$i] = StringReplace($array[$i], ' /', '')
Next

$sString = ''
For $i = 0 To UBound($array) - 1
	$sString &= $array[$i] & @CRLF
Next

MsgBox(64,"",$sString)

;~ _ArrayDisplay($array, "Массив")

Под катом мой вариант, вероятно очень схожий, а может и такой же (вряд ли).
Полностью выполняет поставленную задачу, но тоже без регулярных.

З.Ы. уже вижу, что не такой. "Звенья цепей" отрабатывают как в примере
З.З.Ы. C2H5OH, я тоже долго не мог понять. Там суть в том, что если знак "/" имеется, то он не должен заменяться, вместо "-" указывается вышестоящее (уже с заменой) значение, но без значения после "/".
ТС должен был это подробнее расписать
 
Автор
I

IgRo

Знающий
Сообщения
65
Репутация
5
Re: [RegExp] Заменить сокращения в строках

Потому что в случае, например, входных данных
303640 Ремни /
303641 - плоские
303642 - зубчатые
однозначно
303640 Ремни
303641 Ремни плоские
303642 Ремни зубчатые

тк 303640 Ремни это подгруппа которая состоит из 1-9 видов
 

mef-t

Осваивающий
Сообщения
306
Репутация
30
Re: [RegExp] Заменить сокращения в строках

IgRo
Я бы воздержался от подобных высказываний. Они не верны, или, если верны, то не объясняют

преобразование из
303620 Звенья цепей
303621 - кроме кулачков, траков / соединительные
303622 - переходные


в
303620 Звенья цепей
303621 Звенья цепей кроме кулачков, траков соединительные
303622 Звенья цепей кроме кулачков, траков переходные


т.к. 303621 - не является подгруппой, состоящей из 1-9 видов

В любом случае Вам приведен пример решения, проверяйте. Там все, как Вы хотели.
 
Автор
I

IgRo

Знающий
Сообщения
65
Репутация
5
Re: [RegExp] Заменить сокращения в строках

Я уже мозг на RegExp сломал не как не получается решить.
C2H5OH, mef-t большое спасибо.
 
Верх