Что нового

[Данные, строки] Найти строку по условию и преобразовать эту строку

ViktorSPB

Новичок
Сообщения
109
Репутация
0
Добрый день!
Не силен в регулярных выражениях, самостоятельно с их помощью не могу решить вопрос, перебираю уже строки, очень долго получается и понимаю, что громоздко и концептуально не верно.. Помогите, пожалуйста.
Есть данные в строке
[box title=На входе]
06/04/2012,10:00:13,S,121215,1
06/04/2012,10:00:14,S,121005,1
06/04/2012,10:00:14,S,120400,1
06/04/2012,10:00:14,S,120005,1
06/04/2012,10:00:14,S,119900,1
06/04/2012,10:00:14,S,119840,2
06/04/2012,10:00:14,S,119620,8
06/04/2012,10:00:14,S,119100,1
06/04/2012,10:00:14,S,119005,1
06/04/2012,10:00:14,S,119000,1
06/04/2012,10:00:14,S,119000,1
06/04/2012,10:00:14,S,118900,1
06/04/2012,10:00:14,S,118620,3
06/04/2012,10:00:18,B,119725,1
06/04/2012,10:00:22,B,119650,1
06/04/2012,10:00:23,S,119685,1
[/box]
Нужно с помощью регулярных выражений создать массив или хотя бы строку, содержащую символ S, например, и вида:

20120604,100013,121215,1
20120604,100014,121005,1

Тоесть, нужно вытащить строки с символом S и привести к указанному виду.
Буду признателен за помощь.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Код:
$vTest = ClipGet() ;Данные “на входе”

$sRet = StringRegExpReplace($vTest, '(?i)(\d\d)/(\d\d)/(\d{4}),(\d\d):(\d\d):(\d\d),S(,\d+,\d)', '\3\1\2,\4\5\6\7')
$sRet = StringRegExpReplace($sRet, '(?i)(\d\d)/(\d\d)/(\d{4}),(\d\d):(\d\d):(\d\d),[^S](,\d+,\d)(\r?\n|$)', '')

ConsoleWrite($sRet & @LF)
 

AZJIO

Меценат
Меценат
Сообщения
2,892
Репутация
1,196
ещё вариант
Код:
$v = FileRead(@ScriptDir&'\file.txt')
$v = StringRegExp($v, '(?m)(\d\d)/(\d\d)/(\d{4}),(\d\d):(\d\d):(\d\d),S(,\d{6},\d)', 3)
$out = ''
For $i = 0 To UBound($v)-1 Step 7
	$out &= $v[$i+2]&$v[$i]&$v[$i+1]&','&$v[$i+3]&$v[$i+4]&$v[$i+5]&$v[$i+6]&@CRLF
Next
MsgBox(0, 'Сообщение', $out)
 
Автор
V

ViktorSPB

Новичок
Сообщения
109
Репутация
0
Спасибо большое, CreatoR и AZJIO! Оба ваши варианта более чем исчерпывающе решают мою задачу. У меня даже близко не было таких конструкций..
Второй вариант вообще отсекает несоответствия формату. Супер! Оба примера беру на вооружение, надеюсь, с другими задачами справлюсь на их основе.
Спасибо! :IL_AutoIt_1:

При проверке на большом файле вариант Creator не ест памяти, но сортируется не совсем верно, иногда проходит строка с "B". В варианте AZJIO все четко сортируется, но памяти не хватает. Ошибка выскакивает. Буду разбираться.
Все-равно большое спасибо!

Вот так работает все четко:
Код:
$vTest = ClipGet() ;Данные “на входе”

$sRet = StringRegExpReplace($vTest, '(?i)(\d\d)/(\d\d)/(\d{4}),(\d\d):(\d\d):(\d\d),S(,\d+,\d+)', '\3\1\2,\4\5\6\7')
$sRet = StringRegExpReplace($sRet, '(?i)(\d\d)/(\d\d)/(\d{4}),(\d\d):(\d\d):(\d\d),[^S](,\d+,\d+)(\r?\n|$)', '')

ConsoleWrite($sRet & @LF)

А то двузначные числа вылетали и B проскакивали.
 
Верх