1

Тема: VBScript: Поиск текста по условиям и преобразование в переменные

Так как в VBS совсем недавно, добиться того что написано в заголовке темы, пока не особо удалось. На данный момент пока не могу составить фильтр для поиска. Текст файла в котором ищу данные выглядит так:

ййййййййййй 111999 цццццццц 222222
кккккккккккк 111212 еееееееее 222222
вфцвцвцфвц 11123 вцвцфвфц 999999

Нужно найти первые цифры вида "111***"(первые 5-7 знаков всегда одинаковые) по вторым цифрам, если они равны 222222(если не 222222) первые цифры не брать.

Option Explicit
Dim objFSO, objF, filename, str, objRegExp, code, dis

filename = "E:\exp\DONE.txt"

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objF = objFSO.OpenTextFile(filename,1,false,0)
Do While Not objF.AtEndOfStream
str = objF.Readline()
code = 
dis = 
if instr(str,code) then
 if instr(str,dis) then
msgbox 
exit do
end if
loop
objF.Close

Пока наваял такое, есть ли смысл для этого использовать RegExp или же и instr подойдет? и что значит в строке str = objF.Readline()  скобки, если убрать результат не меняется. Просьба ДАТЬ ПРИМЕРНОЕ НАПРАВЛЕНИЕ, НЕ НАДО ПИСАТЬ ГОТОВЫЙ СКРИПТ(хочу сам дойти до решения). И в итоге полученный результат по поиску, представлять в переменные т.е. : result1 = str1, result2 = str2

2

Re: VBScript: Поиск текста по условиям и преобразование в переменные

Не очень понял, что нужно..
Вообщем, наверно, нужно искать 222222, и если так, то проверяем числа 111***.. А что писать в переменные? Слова, которые написаны между ними (цццццццц) или остатки от чисел 111*** ?

Программист - это не профессия, а смысл жизни (с)

3

Re: VBScript: Поиск текста по условиям и преобразование в переменные

Да, если есть 222222 то брать 111***, если нет 222222, то не брать. В переменные не важно как написать, главное что бы в них были результаты поиска вида 111***(если они подошли под условия поиска) т.е.:

111999 - result1;
111888 - result2;

4

Re: VBScript: Поиск текста по условиям и преобразование в переменные

А первых чисел всегда 6?

Программист - это не профессия, а смысл жизни (с)

5 (изменено: Tox, 2013-08-26 14:53:51)

Re: VBScript: Поиск текста по условиям и преобразование в переменные

Пример первых цифр такой:

1600000000000888
1600000000000101
1600000000000999

111888 для примера было.

20.08.2013 18:23 1 1600000000000888 Платежный сертификат 5000 15 1 -1
20.08.2013 18:23 1 1600000000000101 Платежный сертификат 5000 15 1 5000

Пример из файла, если есть -1, то брать код 1600000000000888.

6 (изменено: -TOXA-, 2013-08-26 14:56:48)

Re: VBScript: Поиск текста по условиям и преобразование в переменные

Блин... Все заново переделывать)
Тогда так.. Первых цифр всегда 16?

Программист - это не профессия, а смысл жизни (с)

7

Re: VBScript: Поиск текста по условиям и преобразование в переменные

-TOXA- пишет:

Блин... Все заново переделывать)
Тогда так.. Первых цифр всегда 16?

Ну извини ..., да всегда 16.

8

Re: VBScript: Поиск текста по условиям и преобразование в переменные

Вообщем так.. Я легких путей никогда не ищу и иду всегда через ж... Вообщем вокруг хожу всегда)
Тут я не использовал RegExp, хотя с ним можно было сделать проще.. Так же и ввод переменных я сделал не очень умным способом.. Вообщем смотрите сами


filename = "E:\exp\DONE.txt"

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objF = objFSO.OpenTextFile(filename, 1, false, 0)
Text = objF.ReadAll

Str_ = Split(Text, vbNewLine)

Index = 1

For Each Str In Str_

If Right(Str, 2) = "-1" Then
If InStr(Str, "1600000") Then 
Execute("Result" & Index & " = " & Mid(Str, InStr(Str, "1600000"), 16))
Index = Index + 1
End If
End If

Next


For i = 1 To Index - 1 'Тут я просто проверяю элементы, которые пошли в переменные
Execute("MsgBox Result" & i)
Next
Программист - это не профессия, а смысл жизни (с)

9 (изменено: Tox, 2013-08-26 15:53:02)

Re: VBScript: Поиск текста по условиям и преобразование в переменные

-TOXA- пишет:

Вообщем так.. Я легких путей никогда не ищу и иду всегда через ж... Вообщем вокруг хожу всегда)
Тут я не использовал RegExp, хотя с ним можно было сделать проще.. Так же и ввод переменных я сделал не очень умным способом.. Вообщем смотрите сами


filename = "E:\exp\DONE.txt"

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objF = objFSO.OpenTextFile(filename, 1, false, 0)
Text = objF.ReadAll

Str_ = Split(Text, vbNewLine)

Index = 1

For Each Str In Str_

If Right(Str, 2) = "-1" Then
If InStr(Str, "1600000") Then 
Execute("Result" & Index & " = " & Mid(Str, InStr(Str, "1600000"), 16))
Index = Index + 1
End If
End If

Next


For i = 1 To Index - 1 'Тут я просто проверяю элементы, которые пошли в переменные
Execute("MsgBox Result" & i)
Next

И так поехали, что-то понял, что-то нет. Так что буду комментировать код, что бы понять, что да как.

Str_ = Split(Text, vbNewLine)

Имеет ли значение нижнее подчеркивание? Представление массивом по построчному разделению?

For Each Str In Str_

как я понял здесь str представлен как отдельная строка, потому и используется  for each т.е. для каждой строки(str) в массиве str_? так?

If Right(Str, 2) = "-1" Then

это как я понял, возвращение справа двух знаков равным -1, но почему тут str, а не str_ не понятно

If InStr(Str, "1600000") Then

второе условие, что в строке должно находится число 1600000

Остальное для меня, какая-то путаница не могу понять, зачем тут используется execute

10 (изменено: -TOXA-, 2013-08-26 16:33:45)

Re: VBScript: Поиск текста по условиям и преобразование в переменные

Я говорю, я не ищу легких путей) Сейчас все прокомментирую..

Вот...

Set objFSO = CreateObject("Scripting.FileSystemObject")  'Вводим объект FSO
Set objF = objFSO.OpenTextFile(filename, 1, false, 0)    'Открываем файл
Text = objF.ReadAll                                      'Вносим в переменую текст из файла

Str_ = Split(Text, vbNewLine)      'Вводим в переменную Str_ (это просто название переменной) массив строк

Index = 1                          'Вводим переменную Index. Это нам понадобится для переменных Result


'=== Тут создаем цикл...
For Each Str In Str_
'=== Теперь, каждый раз, в переменной Str будет находиться значение массива Str_, как помним, каждый элемент - строка

If Right(Str, 2) = "-1" Then 'Смотрим, если последние 2 символа в строке Str = -2, то выполняем уловный переход

If InStr(Str, "1600000") > 0 Then  'Ищем, есть ли в данной строке "1600000", если есть то выполняем условный переход

' Тут происходит следующее.
' Execute нужно, чтобы код из строки выполнялся..
' Мы берем как бы переменную Result, и прибавляем Index, то есть номер переменной, ну чтобы было Result1, Result2, и так далее... Затем добавляем 16 символов..
' В итоге у нас получится примерно такая строка
' Result1 = 1600000000000888
' затем мы выполняем эту строку.. Как вы видите.. Это присвоение переменной значения..

Execute("Result" & Index & " = " & Mid(Str, InStr(Str, "1600000"), 16))

' После добавляем 1 к индексу, чтобы в следующей раз было не Result1, а уже Result2
Index = Index + 1
End If

End If

Next

'==Следующее вообще не нужно.. Можно просто писать MsgBox Result1, MsgBox Result2 и т.д.

For i = 1 To Index - 1 'Тут я просто проверяю элементы, которые пошли в переменные
Execute("MsgBox Result" & i)
Next

Программист - это не профессия, а смысл жизни (с)

11

Re: VBScript: Поиск текста по условиям и преобразование в переменные

Странно msgbox выдает пустоту...

12

Re: VBScript: Поиск текста по условиям и преобразование в переменные

А вы как писали?

Программист - это не профессия, а смысл жизни (с)

13

Re: VBScript: Поиск текста по условиям и преобразование в переменные

Писал msgbox Result1,2,3...

14 (изменено: -TOXA-, 2013-08-26 16:46:58)

Re: VBScript: Поиск текста по условиям и преобразование в переменные

MsgBox Result1
MsgBox Result2

'По идее должно работать... Может я что-то не так скопировал..

Хотя, скорее всего, пробелы просто вконце есть, Попробуй так


Я говорю, я не ищу легких путей) Сейчас все прокомментирую..

Вот...

Set objFSO = CreateObject("Scripting.FileSystemObject")  'Вводим объект FSO
Set objF = objFSO.OpenTextFile(filename, 1, false, 0)    'Открываем файл
Text = objF.ReadAll                                      'Вносим в переменую текст из файла

Str_ = Split(Text, vbNewLine)      'Вводим в переменную Str_ (это просто название переменной) массив строк

Index = 1                          'Вводим переменную Index. Это нам понадобится для переменных Result


'=== Тут создаем цикл...
For Each Str In Str_
'=== Теперь, каждый раз, в переменной Str будет находиться значение массива Str_, как помним, каждый элемент - строка

If Right(RTrim(Str), 2) = "-1" Then 'Смотрим, если последние 2 символа в строке Str = -2, то выполняем уловный переход

If InStr(Str, "1600000") > 0 Then  'Ищем, есть ли в данной строке "1600000", если есть то выполняем условный переход

' Тут происходит следующее.
' Execute нужно, чтобы код из строки выполнялся..
' Мы берем как бы переменную Result, и прибавляем Index, то есть номер переменной, ну чтобы было Result1, Result2, и так далее... Затем добавляем 16 символов..
' В итоге у нас получится примерно такая строка
' Result1 = 1600000000000888
' затем мы выполняем эту строку.. Как вы видите.. Это присвоение переменной значения..

Execute("Result" & Index & " = " & Mid(Str, InStr(Str, "1600000"), 16))

' После добавляем 1 к индексу, чтобы в следующей раз было не Result1, а уже Result2
Index = Index + 1
End If

End If

Next

'==Следующее вообще не нужно.. Можно просто писать MsgBox Result1, MsgBox Result2 и т.д.

For i = 1 To Index - 1 'Тут я просто проверяю элементы, которые пошли в переменные
Execute("MsgBox Result" & i)
Next

Программист - это не профессия, а смысл жизни (с)

15

Re: VBScript: Поиск текста по условиям и преобразование в переменные

Я кажется понял, есть строка:

If Right(Str, 2) = "-1" Then

она берет 2 символа справа? или  берет -1 с поиском справа c длиной в 2 символа?
Просто у меня после -1 есть ещё текст.

16 (изменено: -TOXA-, 2013-08-26 16:51:40)

Re: VBScript: Поиск текста по условиям и преобразование в переменные

Ааа.. Нее.. Я беру справа 2 символа.. Но если нужно поиск, то замени на InStr("-1", Str) > 0

Программист - это не профессия, а смысл жизни (с)

17

Re: VBScript: Поиск текста по условиям и преобразование в переменные

-TOXA- пишет:

Ааа.. Нее.. Я беру справа 2 символа.. Но если нужно поиск, то замени на InStr("-1", Str) > 0

Если написать InStr("-1", Str) > 0(как я понимаю вместо If Right(Str, 2) = "-1" Then), то выдает пустоту , если str поменять местами с -1 выдает странные цифры(1,60000000000089E+15)

18

Re: VBScript: Поиск текста по условиям и преобразование в переменные

Tox
Из первого описания сложно понять, что же Вам требуется:

Нужно найти первые цифры вида "111***"(первые 5-7 знаков всегда одинаковые) по вторым цифрам, если они равны 222222(если не 222222) первые цифры не брать.

А вот это описание более осмысленное:

Tox пишет:

20.08.2013    18:23    1    1600000000000888    Платежный сертификат 5000    15    1    -1    
20.08.2013    18:23    1    1600000000000101    Платежный сертификат 5000    15    1    5000

Пример из файла, если есть -1, то брать код 1600000000000888.

Его можно описать так:
Для каждой строки, в которой поле №8 == -1 что-то сделать с полем №4.

Задача решается как с помощью регулярных выражений, так и без них. Так же как и с/без VBS. Заметил, что поля разделены символом табуляции. Это в реальности так или только в качестве примера?

( 2 * b ) || ! ( 2 * b )

19

Re: VBScript: Поиск текста по условиям и преобразование в переменные

Rumata пишет:

Tox
Из первого описания сложно понять, что же Вам требуется:

Нужно найти первые цифры вида "111***"(первые 5-7 знаков всегда одинаковые) по вторым цифрам, если они равны 222222(если не 222222) первые цифры не брать.

А вот это описание более осмысленное:

Tox пишет:

20.08.2013    18:23    1    1600000000000888    Платежный сертификат 5000    15    1    -1    
20.08.2013    18:23    1    1600000000000101    Платежный сертификат 5000    15    1    5000

Пример из файла, если есть -1, то брать код 1600000000000888.

Его можно описать так:
Для каждой строки, в которой поле №8 == -1 что-то сделать с полем №4.

Задача решается как с помощью регулярных выражений, так и без них. Так же как и с/без VBS. Заметил, что поля разделены символом табуляции. Это в реальности так или только в качестве примера?

Да, поля разделены табуляцией, сейчас подумал, ведь vbs имеет возможность выполнять sql запросы(так ведь?), просто данные которые я пытаюсь обработать, получаются из dbf таблицы , да бы не делать безсмысленную перегонку данных, можно обращаться напрямую в таблицу... и путем sql запроса получать те же данные...

20

Re: VBScript: Поиск текста по условиям и преобразование в переменные

Если бы сразу был выложен образец (хотя бы частичный) реального файла, упакованный в архив — вопрос бы не растянулся на два десятка постов.

21 (изменено: Tox, 2013-08-26 17:51:51)

Re: VBScript: Поиск текста по условиям и преобразование в переменные

alexii пишет:

Если бы сразу был выложен образец (хотя бы частичный) реального файла, упакованный в архив — вопрос бы не растянулся на два десятка постов.

Пример данных был уже в 5 посте.  Просто в файле не 2 строки, а 20-100, не думаю , что это сделало бы погоды ...

22

Re: VBScript: Поиск текста по условиям и преобразование в переменные

Я тут образумился, и понял, что я бред какой-то писал) Попробуй так:

Dim Result(200)

For i = 0 To 200
Result(i) = "_"
Next

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objF = objFSO.OpenTextFile(filename, 1, false, 0)    
Text = objF.ReadAll                                   

Str_ = Split(Text, vbNewLine)      
Index = 0

For Each Str In Str_ 

Parts = Split(Str, vbTab)

If (Parts(8) = "-1") And (Left(Parts(3), 8) = "16000000") Then
Result(Index) = Parts(3)
Index = Index + 1
End If

Next

Result_ = Filter(Result, "_", False)

For Each p In Result_
MsgBox p
Next
Программист - это не профессия, а смысл жизни (с)

23

Re: VBScript: Поиск текста по условиям и преобразование в переменные

-TOXA- пишет:

Я тут образумился, и понял, что я бред какой-то писал) Попробуй так:

Dim Result(200)

For i = 0 To 200
Result(i) = "_"
Next

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objF = objFSO.OpenTextFile(filename, 1, false, 0)    
Text = objF.ReadAll                                   

Str_ = Split(Text, vbNewLine)      
Index = 0

For Each Str In Str_ 

Parts = Split(Str, vbTab)

If (Parts(8) = "-1") And (Left(Parts(3), 8) = "16000000") Then
Result(Index) = Parts(3)
Index = Index + 1
End If

Next

Result_ = Filter(Result, "_", False)

For Each p In Result_
MsgBox p
Next

Пишет - Индекс выходит за пределы допустимого диапазона: '[number: 8]'

24

Re: VBScript: Поиск текста по условиям и преобразование в переменные

Tox, «пример данных» был и в первом посте. И даже после последнего «примера данных» возник вопрос.

данные которые я пытаюсь обработать, получаются из dbf таблицы , да бы не делать безсмысленную перегонку данных, можно обращаться напрямую в таблицу... и путем sql запроса получать те же данные...

Выкладывайте пример таблицы. Не всю, несколько записей. Упакуйте в архив, выложите сюда или на RGhost, а сюда — ссылку.

25

Re: VBScript: Поиск текста по условиям и преобразование в переменные

alexii пишет:

Tox, «пример данных» был и в первом посте. И даже после последнего «примера данных» возник вопрос.

данные которые я пытаюсь обработать, получаются из dbf таблицы , да бы не делать безсмысленную перегонку данных, можно обращаться напрямую в таблицу... и путем sql запроса получать те же данные...

Выкладывайте пример таблицы. Не всю, несколько записей. Упакуйте в архив, выложите сюда или на RGhost, а сюда — ссылку.

http://rghost.ru/48385323

26 (изменено: -TOXA-, 2013-08-26 18:54:09)

Re: VBScript: Поиск текста по условиям и преобразование в переменные

Ошибка происходит из за того, что, скорее всего, в конце есть пустые строки.. Уберите их.. Или же выключите ошибки в скрипте, написав в начале On Error Resume Next..

Или же просто проверять, сколько элементов..

Dim Result(200)

For i = 0 To 200
Result(i) = "_"
Next

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objF = objFSO.OpenTextFile(filename, 1, false, 0)    
Text = objF.ReadAll                                   

Str_ = Split(Text, vbNewLine)      
Index = 0

For Each Str In Str_ 

Parts = Split(Str, vbTab)

If UBound(Parts) = 8 Then
If (Parts(8) = "-1") And (Left(Parts(3), 8) = "16000000") Then
Result(Index) = Parts(3)
Index = Index + 1
End If
End If

Next

Result_ = Filter(Result, "_", False)

For Each p In Result_
MsgBox p
Next
Программист - это не профессия, а смысл жизни (с)

27

Re: VBScript: Поиск текста по условиям и преобразование в переменные

alexii пишет:

Tox, «пример данных» был и в первом посте. И даже после последнего «примера данных» возник вопрос.

данные которые я пытаюсь обработать, получаются из dbf таблицы , да бы не делать безсмысленную перегонку данных, можно обращаться напрямую в таблицу... и путем sql запроса получать те же данные...

Выкладывайте пример таблицы. Не всю, несколько записей. Упакуйте в архив, выложите сюда или на RGhost, а сюда — ссылку.

http://rghost.ru/48385323

28

Re: VBScript: Поиск текста по условиям и преобразование в переменные

-TOXA- пишет:

Ошибка происходит из за того, что, скорее всего, в конце есть пустые строки.. Уберите их.. Или же выключите ошибки в скрипте, написав в начале On Error Resume Next..

Или же просто проверять, сколько элементов..

Dim Result(200)

For i = 0 To 200
Result(i) = "_"
Next

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objF = objFSO.OpenTextFile(filename, 1, false, 0)    
Text = objF.ReadAll                                   

Str_ = Split(Text, vbNewLine)      
Index = 0

For Each Str In Str_ 

Parts = Split(Str, vbTab)

If UBound(Parts) = 8 Then
If (Parts(8) = "-1") And (Left(Parts(3), 8) = "16000000") Then
Result(Index) = Parts(3)
Index = Index + 1
End If
End If

Next

Result_ = Filter(Result, "_", False)

For Each p In Result_
MsgBox p
Next

Выложил кусок файла, там в центре где идет текст, между словами идут пробелы.

29

Re: VBScript: Поиск текста по условиям и преобразование в переменные

Tox, это не dbf-таблица. А я просил именно её.

30 (изменено: Tox, 2013-08-27 12:24:46)

Re: VBScript: Поиск текста по условиям и преобразование в переменные

http://rghost.ru/48398989 выложил таблицу.

31

Re: VBScript: Поиск текста по условиям и преобразование в переменные

Tox, вот примерная болванка кода:

Option Explicit

Dim strPath
Dim strBase

Dim objConnection
Dim objRecordset
Dim objField


strPath = "E:\Песочница\0317"
strBase = "data.dbf"

Set objConnection = WScript.CreateObject("ADODB.Connection")

With objConnection
    .ConnectionString = _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=" & strPath & ";" & _
        "Extended Properties=dBASE IV;"
    
    .Open
End With

Set objRecordset  = WScript.CreateObject("ADODB.Recordset")

With objRecordset
    Set .ActiveConnection = objConnection
    
    .Open "SELECT * FROM " & strBase & " WHERE SUM = -1"
    
    For Each objField In .Fields
        WScript.StdOut.Write objField.Name & ";"
    Next
    
    WScript.StdOut.WriteLine
    
    Do Until .EOF
        For Each objField In .Fields
            WScript.StdOut.Write StrConvert(CStr(objField.Value & ""), "cp866", "windows-1251") & ";"
        Next
        
        WScript.StdOut.WriteLine
        
        .MoveNext
    Loop
    
    .Close
End With

objConnection.Close

Set objRecordset  = Nothing
Set objConnection = Nothing

WScript.Quit 0
'=============================================================================

'=============================================================================
' HKEY_CLASSES_ROOT\MIME\Database\Charset
' cp866, windows-1251, koi8-r, unicode, utf-8, _autodetect
'=============================================================================
Function StrConvert(ByVal strText, ByVal strSourceCharset, ByVal strDestCharset)
    Const adTypeText      = 2
    Const adModeReadWrite = 3
    
    
    With WScript.CreateObject("ADODB.Stream")
        .Type      = adTypeText
        .Mode      = adModeReadWrite
        
        .Open
        
        .Charset   = strSourceCharset
        .WriteText strText
        
        .Position  = 0
        .Charset   = strDestCharset
        StrConvert = .ReadText
        
        .Close
    End With
End Function
'=============================================================================

Условие задано в «WHERE SUM = -1», помнится, оно должно было быть именно таким.

Поскольку у Вас внутри ANSI, а умолчание для данного формата — OEM, то, дабы не лазать и не править реестр («HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Xbase\DataCodePage»), добавлена простая обратная конвертация.

Вам конечный результат в каком виде нужен?