PDA

Показать полную графическую версию : [решено] Выделение числа из текста


u-Art
17-01-2010, 21:26
Приветствую!
Уважаемые Гуру, подскажите, как можно выделить число из текстовой строки?
Строка всегда начинается с символа TAB, затем идет число, причем если более 3-х знаков, то разделяется запятой, далее ENTER и текст с ненужными числами.
В данный момент использую извращенный метод: проверку на наличие запятой, помещением строки в открытый блокнот и автоматическое удаление запятой и лишних текстовых знаков.

madmasles
17-01-2010, 21:43
А можно увидеть образец того, что есть, того что нужно получить и свой скрипт.

u-Art
17-01-2010, 21:58
Образец строки:

2,541
В наличии: мало
BK500-RS CS


кусок скрипта обработки в блокноте:

WinActivate("work.txt - Блокнот","")
WinWaitActive ("work.txt - Блокнот","")
Send("{CTRLDOWN}a{CTRLUP}{DEL}") ; Очистка блокнота
Send("{CTRLDOWN}v{CTRLUP}")
MouseClick("left", 9, 51, 1, 0) ; Клик в начало Блокнота
Send("{DEL}") ; Удаляем ТАб
Send("{SHIFTDOWN}") ; Начало выделения цены
MouseMove(66,51,1)
MouseDown("left")
MouseUp("left")
Send("{SHIFTUP}") ; Конец выделения цены
Send("{CTRLDOWN}c{CTRLUP}") ; Копируем цену обратно в буфер
$cena = ClipGet()

Обработка если нет запятой, в случае с запятой сначала три клика и удаление запятой.

madmasles
17-01-2010, 22:09
Я правильно понял, что из файла с текстом вида
1 строка - 2,541
2 строка - В наличии: мало
3 строка - BK500-RS CS

нужно получить в другой файл выборку всех элементов типа 2,541?
Вы бы скопировали фрагмент Вашего исходного текста и здесь привели.

u-Art
17-01-2010, 22:17
Я правильно понял, что из файла с текстом вида »

Да, верно, только обработку желательно вести непосредственно скриптом, т.к. через файл или блокнот уходит много времени.
Изначально текст в буфере, к сожалению на странице форума не отобразился отступ символа ТАБ перед 2,541

Creat0R
17-01-2010, 23:59
$sText = ClipGet (http://www.autoitscript.com/autoit3/docs/functions/ClipGet.htm)()
$sResult = StringRegExpReplace (http://www.autoitscript.com/autoit3/docs/functions/StringRegExpReplace.htm)($sText, "(?s)\s+?([0-9,?]*).*", "\1")

MsgBox (http://www.autoitscript.com/autoit3/docs/functions/MsgBox.htm)(64, 'Title', $sResult)

madmasles
18-01-2010, 00:30
У меня первоначальный вариант был длиннее, плохо разбираюсь в "pattern", но воспользовавшись как всегда идеальной формулой от Creat0R $sResult = StringRegExpReplace($sText, "(?s)\s+?([0-9,?]*).*", "\1") »

получил вот такой вариант:
#include <File.au3>

$file1 = "1.txt"
$file2 = "2.txt"

FileOpen($file1, 0)
FileOpen($file2, 2)
$CountLines = _FileCountLines($file1)
For $i = 1 To $CountLines
$sText = FileReadLine($file1, $i)
$sResult = StringRegExpReplace($sText, "(?s)\s+?([0-9,?]*).*", "\1")
If StringLen($sResult) > 0 Then
FileWrite($file2, $sResult & @CRLF)
EndIf
Next
FileClose($file1)
FileClose($file2)

1.txt это файл для обработки, 2.txt это файл-результат.
Хочу попробовать то же самое сделать через массив, вроде намного быстрее получается.

Creat0R
18-01-2010, 01:05
получил вот такой вариант: »
Так будет правильнее:


$sFile1 = "1.txt"
$sFile2 = "2.txt"

$hFile1 = FileOpen (http://www.autoitscript.com/autoit3/docs/functions/FileOpen.htm)($sFile1, 0)
$hFile2 = FileOpen (http://www.autoitscript.com/autoit3/docs/functions/FileOpen.htm)($sFile2, 2)

$i = 0

While (http://www.autoitscript.com/autoit3/docs/keywords.htm#While) 1
$i += 1
$sText = FileReadLine (http://www.autoitscript.com/autoit3/docs/functions/FileReadLine.htm)($hFile1, $i)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) @error (http://www.autoitscript.com/autoit3/docs/macros.htm#@error) <> 0 Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) ExitLoop (http://www.autoitscript.com/autoit3/docs/keywords.htm#ExitLoop)

$sResult = StringRegExpReplace (http://www.autoitscript.com/autoit3/docs/functions/StringRegExpReplace.htm)($sText, "\s+?([0-9,?]+).*", "\1")
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) @extended (http://www.autoitscript.com/autoit3/docs/macros.htm#@extended) > 0 Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) FileWriteLine (http://www.autoitscript.com/autoit3/docs/functions/FileWriteLine.htm)($hFile2, $sResult)
WEnd (http://www.autoitscript.com/autoit3/docs/keywords.htm#WEnd)

FileClose (http://www.autoitscript.com/autoit3/docs/functions/FileClose.htm)($hFile1)
FileClose (http://www.autoitscript.com/autoit3/docs/functions/FileClose.htm)($hFile2)

u-Art
18-01-2010, 01:05
но воспользовавшись как всегда идеальной формулой от Creat0R »

Благодарствую!
Действительно красиво, осталось решить проблему с удалением запятой, попробую поковыряться с функциями.

Creat0R
18-01-2010, 01:31
Или так:


$sFile1 = "1.txt"
$sFile2 = "2.txt"

$sText = FileRead (http://www.autoitscript.com/autoit3/docs/functions/FileRead.htm)($sFile1)
$aResult = StringRegExp (http://www.autoitscript.com/autoit3/docs/functions/StringRegExp.htm)($sText, "(?s)\s+?([0-9,?]+)", 3)

$hFile2 = FileOpen (http://www.autoitscript.com/autoit3/docs/functions/FileOpen.htm)($sFile2, 2)

For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $i = 0 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) UBound (http://www.autoitscript.com/autoit3/docs/functions/UBound.htm)($aResult)-1
FileWriteLine (http://www.autoitscript.com/autoit3/docs/functions/FileWriteLine.htm)($hFile2, StringReplace (http://www.autoitscript.com/autoit3/docs/functions/StringReplace.htm)($aResult[$i], ",", ""))
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)

FileClose (http://www.autoitscript.com/autoit3/docs/functions/FileClose.htm)($hFile2)

осталось решить проблему с удалением запятой »
См. мой последний пост.

madmasles
18-01-2010, 01:34
В 1.txt записал 10000 строк по образцу. Мой первый вариант отрабатывал Time: 79.999 секунд, а вот этот вариант:
#include <File.au3>
$aTable = ""
$hFile1 = "1.txt"
$hFile2 = "2.txt"
FileOpen($hFile1, 0)
FileOpen($hFile2, 2)
_FileReadToArray($hFile1, $aTable)
$i = 0

While 1
$i += 1
If $i = $aTable[0] Then ExitLoop
$sResult = StringRegExpReplace($aTable[$i], "(?s)\s+?([0-9,?]*).*", "\1")
$sResult = StringReplace($sResult, ",", "")
If @extended > 0 Then FileWriteLine($hFile2, $sResult)
WEnd
FileClose($hFile1)
FileClose($hFile2)

тот же файл обработал за Time: 7.467 секунд! Скорость выше более, чем в 10 раз!
u-Art,
Запятые код тоже убирает, правда двумя формулами, хотя наверняка Creat0R сможет сделать это одной.

Пока писал свое сообщение, появился ответ Creat0R.

Creat0R,
Ваш вариант обработал 10000 строк за Time: 2.442! Просто экстра класс!

Creat0R
18-01-2010, 01:39
вот этот вариант »
Тут неправильное использование функций FileOpen, см. мой последний пример, да и в справку не помешало бы заглянуть.

madmasles
18-01-2010, 01:53
Creat0R,
Я правильно понял, что у меня 2 лишних действия: "FileOpen($hFile1, 0)" и "FileClose($hFile1)"?

Creat0R
18-01-2010, 02:00
Я правильно понял »
Нет :) Читайте справку.

Ваш вариант обработал 10000 строк за Time: 2.442! »
Вот ещё быстрее, по идее:


$sFile1 = "1.txt"
$sFile2 = "2.txt"

$sText = FileRead (http://www.autoitscript.com/autoit3/docs/functions/FileRead.htm)($sFile1)
$aResult = StringRegExp (http://www.autoitscript.com/autoit3/docs/functions/StringRegExp.htm)($sText, "\s+?([0-9,?]+)", 3)
$sResults = ""

For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $i = 0 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) UBound (http://www.autoitscript.com/autoit3/docs/functions/UBound.htm)($aResult)-1
$sResults &= $aResult[$i] & @CRLF (http://www.autoitscript.com/autoit3/docs/macros.htm#@CRLF)
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)

$hFile2 = FileOpen (http://www.autoitscript.com/autoit3/docs/functions/FileOpen.htm)($sFile2, 2)
FileWrite (http://www.autoitscript.com/autoit3/docs/functions/FileWrite.htm)($hFile2, StringStripWS (http://www.autoitscript.com/autoit3/docs/functions/StringStripWS.htm)(StringReplace (http://www.autoitscript.com/autoit3/docs/functions/StringReplace.htm)($sResults, ",", ""), 2))
FileClose (http://www.autoitscript.com/autoit3/docs/functions/FileClose.htm)($hFile2)

madmasles
18-01-2010, 02:26
Creat0R,
Ваш последний вариант у меня: Time: 2.351
Предпоследний: Time: 2.331.
Практически одинаково.

По поводу
Тут неправильное использование функций FileOpen »
у меня последнее предположение, что я рано открыл файл2, надо после того, как считал в массив файл1. Если это не так, то я Вас очень прошу, объясните что не так.

Creat0R
18-01-2010, 03:07
у меня последнее предположение »
Зачем предполагать, ещё раз, и последний раз пишу...

Читайте справку »

Это вам же на пользу.




© OSzone.net 2001-2012