Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Выделение числа из текста (http://forum.oszone.net/showthread.php?t=163821)

u-Art 17-01-2010 21:26 1322977

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

madmasles 17-01-2010 21:43 1322990

А можно увидеть образец того, что есть, того что нужно получить и свой скрипт.

u-Art 17-01-2010 21:58 1322996

Образец строки:

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 1323002

Я правильно понял, что из файла с текстом вида
Цитата:

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

u-Art 17-01-2010 22:17 1323010

Цитата:

Цитата madmasles
Я правильно понял, что из файла с текстом вида »

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

Creat0R 17-01-2010 23:59 1323061

Код:

$sText = ClipGet()
$sResult = StringRegExpReplace($sText, "(?s)\s+?([0-9,?]*).*", "\1")

MsgBox(64, 'Title', $sResult)


madmasles 18-01-2010 00:30 1323078

У меня первоначальный вариант был длиннее, плохо разбираюсь в "pattern", но воспользовавшись как всегда идеальной формулой от Creat0R
Цитата:

Цитата 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 1323093

Цитата:

Цитата madmasles
получил вот такой вариант: »

Так будет правильнее:

Код:

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

$hFile1 = FileOpen($sFile1, 0)
$hFile2 = FileOpen($sFile2, 2)

$i = 0

While 1
    $i += 1
    $sText = FileReadLine($hFile1, $i)
    If @error <> 0 Then ExitLoop

    $sResult = StringRegExpReplace($sText, "\s+?([0-9,?]+).*", "\1")
    If @extended > 0 Then FileWriteLine($hFile2, $sResult)
WEnd

FileClose($hFile1)
FileClose($hFile2)


u-Art 18-01-2010 01:05 1323094

Цитата:

Цитата madmasles
но воспользовавшись как всегда идеальной формулой от Creat0R »

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

Creat0R 18-01-2010 01:31 1323102

Или так:

Код:

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

$sText = FileRead($sFile1)
$aResult = StringRegExp($sText, "(?s)\s+?([0-9,?]+)", 3)

$hFile2 = FileOpen($sFile2, 2)

For $i = 0 To UBound($aResult)-1
    FileWriteLine($hFile2, StringReplace($aResult[$i], ",", ""))
Next

FileClose($hFile2)

Цитата:

Цитата u-Art
осталось решить проблему с удалением запятой »

См. мой последний пост.

madmasles 18-01-2010 01:34 1323104

В 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 1323106

Цитата:

Цитата madmasles
вот этот вариант »

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

madmasles 18-01-2010 01:53 1323112

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

Creat0R 18-01-2010 02:00 1323116

Цитата:

Цитата madmasles
Я правильно понял »

Нет :) Читайте справку.

Цитата:

Цитата madmasles
Ваш вариант обработал 10000 строк за Time: 2.442! »

Вот ещё быстрее, по идее:

Код:

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

$sText = FileRead($sFile1)
$aResult = StringRegExp($sText, "\s+?([0-9,?]+)", 3)
$sResults = ""

For $i = 0 To UBound($aResult)-1
    $sResults &= $aResult[$i] & @CRLF
Next

$hFile2 = FileOpen($sFile2, 2)
FileWrite($hFile2, StringStripWS(StringReplace($sResults, ",", ""), 2))
FileClose($hFile2)


madmasles 18-01-2010 02:26 1323122

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

По поводу
Цитата:

Цитата Creat0R
Тут неправильное использование функций FileOpen »

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

Creat0R 18-01-2010 03:07 1323134

Цитата:

Цитата madmasles
у меня последнее предположение »

Зачем предполагать, ещё раз, и последний раз пишу...

Цитата:

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

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


Время: 03:43.

Время: 03:43.
© OSzone.net 2001-