Что нового

[Данные, строки] Сложный отбор строк по условию

AlexVong

Новичок
Сообщения
112
Репутация
1
AutoIt: 3.3.8.1
Задача:
Подскажите как отобрать все записи из текстового файла по такому принципу?
1.) 4-ая колонка начинается на 1001*, 11-ая колонка на 2905*, а 13 не равна 40
2.) 4-ая колонка не начинается на 2620*, 11-ая колонка на 1001*, а 13 равна 5
Код:
11510555 11113 44440313 61100000004500 20.34 RUB 10.10.2012 20.34 RUB 300006 1001000000004 0 5 10.10.2012 ggggggg gg gggggggg gggg 555 /300006/000000/000004/ 
11509555 44776 44449635 1001000000010 10.00 RUB 10.10.2012 10.00 RUB 300006 2905000000400 1 5 10.10.2012 jjjjjjjjjjjjjjj jjjjjjjj fff /300006/000008/000009/ 
11509444 44413 44449314 290000000009 2 406.49 RUB 10.10.2012 2 406.49 RUB 300006 26200000000004 1  10.10.2012 iiiiiiiii iiiiiiiiiii ii 555 /300006/005000/000004/
результат :
1.) 11509555 44776 44449635 1001000000010 10.00 RUB 10.10.2012 10.00 RUB 300006 2905000000400 1 5 10.10.2012 jjjjjjjjjjjjjjj jjjjjjjj fff /300006/000008/000009/
2.) 11510555 11113 44440313 61100000004500 20.34 RUB 10.10.2012 20.34 RUB 300006 1001000000004 0 5 10.10.2012 ggggggg gg gggggggg gggg 555 /300006/000000/000004/
 

DarWiM

Продвинутый
Сообщения
527
Репутация
90
Re: Сложный отбор

OffTopic:
Можно, всё можно.
А тему оформить иначе не помешает
 

Fever

Скриптер
Сообщения
308
Репутация
112
AlexVong, не смог составить регулярное выражение, но получилось вот так:

Код:
Local _
		$sString1 = "11509555 44776 44449635 1001000000010 10.00 RUB 10.10.2012 10.00 RUB 300006 2905000000400 1 5 10.10.2012 jjjjjjjjjjjjjjj jjjjjjjj fff /300006/000008/000009/", _
		$sString2 = "11510555 11113 44440313 61100000004500 20.34 RUB 10.10.2012 20.34 RUB 300006 1001000000004 0 5 10.10.2012 ggggggg gg gggggggg gggg 555 /300006/000000/000004/"

;= 1 =

$aStr = StringSplit($sString1, " ")

If StringLeft($aStr[4], 4) == "1001" And StringLeft($aStr[11], 4) == "2905" And $aStr[13] <> 40 Then
	MsgBox(0, "", "String 1 - OK")
Else
	MsgBox(0, "", "String 1 - Wrong")
EndIf

;= 2 =

$aStr = StringSplit($sString2, " ")

If StringLeft($aStr[4], 4) <> "2620" And StringLeft($aStr[11], 4) <> "1001" And $aStr[13] = 5 Then
	MsgBox(0, "", "String 2 - OK")
Else
	MsgBox(0, "", "String 2 - Wrong")
EndIf
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Вот регуляркой
Код:
#include <array.au3>
$sData = FileRead("1.txt")
$aData1 = StringRegExp($sData,'(?m)^(?:\S+\s){3}1001(?:\S+\s){7}2905(?:\S+\s){2}(?!40\s).*$',3)
$aData2 = StringRegExp($sData,'(?m)^(?:\S+\s){3}(?!2620)(?:\S+\s){7}1001(?:\S+\s){2}5\s.*$',3)
_ArrayDisplay($aData1)
_ArrayDisplay($aData2)
 

Fever

Скриптер
Сообщения
308
Репутация
112
inververs, спасибо, такой пример и мне будет полезен, но у Вас тут одна ошибочка, вроде как :-[ заменить
Код:
'{7}1001(?:\S+\s)'

>>
Код:
'{7}(?!1001)(?:\S+\s)'
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
11 колонка вроде должна начинаться на 1001 :smile:
 

Fever

Скриптер
Сообщения
308
Репутация
112
inververs, "4-ая колонка не начинается на 2620*, 11-ая колонка на 1001*"
как-то это "не" двусмысленно тут стоит. я его отнес и ко второй части условия.
 
Верх