Показать полную графическую версию : [решено] Выделение числа из текста
Приветствую!
Уважаемые Гуру, подскажите, как можно выделить число из текстовой строки?
Строка всегда начинается с символа TAB, затем идет число, причем если более 3-х знаков, то разделяется запятой, далее ENTER и текст с ненужными числами.
В данный момент использую извращенный метод: проверку на наличие запятой, помещением строки в открытый блокнот и автоматическое удаление запятой и лишних текстовых знаков.
madmasles
17-01-2010, 21:43
А можно увидеть образец того, что есть, того что нужно получить и свой скрипт.
Образец строки:
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?
Вы бы скопировали фрагмент Вашего исходного текста и здесь привели.
Я правильно понял, что из файла с текстом вида »
Да, верно, только обработку желательно вести непосредственно скриптом, т.к. через файл или блокнот уходит много времени.
Изначально текст в буфере, к сожалению на странице форума не отобразился отступ символа ТАБ перед 2,541
$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 это файл-результат.
Хочу попробовать то же самое сделать через массив, вроде намного быстрее получается.
получил вот такой вариант: »
Так будет правильнее:
$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)
но воспользовавшись как всегда идеальной формулой от Creat0R »
Благодарствую!
Действительно красиво, осталось решить проблему с удалением запятой, попробую поковыряться с функциями.
Или так:
$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! Просто экстра класс!
вот этот вариант »
Тут неправильное использование функций FileOpen, см. мой последний пример, да и в справку не помешало бы заглянуть.
madmasles
18-01-2010, 01:53
Creat0R,
Я правильно понял, что у меня 2 лишних действия: "FileOpen($hFile1, 0)" и "FileClose($hFile1)"?
Я правильно понял »
Нет :) Читайте справку.
Ваш вариант обработал 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. Если это не так, то я Вас очень прошу, объясните что не так.
у меня последнее предположение »
Зачем предполагать, ещё раз, и последний раз пишу...
Читайте справку »
Это вам же на пользу.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC