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

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   поиск значения в текстовом файле и выбор данной строки (http://forum.oszone.net/showthread.php?t=300842)

God-of-Chaos 07-06-2015 05:21 2515625

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

Есть текстовый файл с содержимым со следующими полями, разделенными запятыми (полей больше, чем указано в примере)

номер,ip адрес,путь
1234,xxx.xxx.xxx.xxx,c:\папка

таких строк может быть много (десятки, сотни)

необходимо произвести поиск по значению поля номер и если значение найдено, присвоить определенно переменно значение все этой строки
интересует решение именно на vbs

всем заранее спасибо.

greg zakharov 07-06-2015 07:15 2515628

В заголовке темы указано WSH/VBScript/JS, в посте - vbs. Вы сперва определитесь что именно нужно. В качестве бонуса могу лишь подкинуть код на JS.
Код:

(function(num) {
  var fso, lin;
 
  try {
    with (new ActiveXObject('Scripting.FileSystemObject')) {
      fso = OpenTextFile('myfile', 1);
      while (!fso.AtEndOfStream) {
        lin = fso.ReadLine();
        if (lin.split(',')[0] === num) break;
      }
      fso.Close();
    }
   
    WScript.echo(lin);
  }
  catch (e) {
    WScript.echo(e);
  }
}(
  WScript.Arguments.length !== 1
  ? WScript.Quit(1)
  : WScript.Arguments.Unnamed(0)
));

Пример использования:
Код:

C:\> cscript //nologo script.js 1234

Iska 07-06-2015 12:01 2515677

Цитата:

Цитата greg zakharov
В заголовке темы указано WSH/VBScript/JS, в посте - vbs »

Начало заголовка выбирается из предопределённого перечня в качестве категории:
Скрытый текст


Цитата:

Цитата God-of-Chaos
Есть текстовый файл »

Упакуйте образец такого файла в архив. Прикрепите архив к сообщению или выложите на RGhost.

Цитата:

Цитата God-of-Chaos
таких строк может быть много (десятки, сотни) »

Действительно только десятки или сотни, или же могут быть десятки или сотни тысяч строк?

Цитата:

Цитата God-of-Chaos
необходимо произвести поиск по значению поля номер »

Строки упорядочены по возрастанию номера или расположены в произвольном порядке?

Цитата:

Цитата God-of-Chaos
и если значение найдено, присвоить определенно переменно значение все этой строки »

Может ли быть несколько строк с таких номером? Если — да, то как поступать в этом случае?

God-of-Chaos 07-06-2015 15:12 2515723

Вложений: 1
Цитата:

Цитата Iska
Упакуйте образец такого файла в архив. Прикрепите архив к сообщению или выложите на RGhost. »

Прикрепил к сообщению

Цитата:

Цитата Iska
Действительно только десятки или сотни, или же могут быть десятки или сотни тысяч строк? »

максимум может быть 9999 значений, но на первое время несколько сотен будет, не больше, в дальнейшем список должен быть перенесен в базу, и запрос делаться в базу для получения строки...головная боль в будущем будет :)

Цитата:

Цитата Iska
Строки упорядочены по возрастанию номера или расположены в произвольном порядке? »

строки в произвольном порядке

Цитата:

Цитата Iska
Может ли быть несколько строк с таких номером? Если — да, то как поступать в этом случае? »

4-х значный номер будет уникальным

greg zakharov 07-06-2015 15:51 2515728

Код:

On Error Resume Next

Function SelectString(ByVal num)
  Dim file, line
 
  With CreateObject("Scripting.FileSystemObject")
    Set file = .OpenTextFile("listprint1.txt", 1)
   
    Do While file.AtEndOfStream <> True
      line = file.ReadLine
      If CInt(Split(line, ",")(0)) = CInt(num) Then Exit Do
    Loop
   
    file.Close
  End With
 
  SelectString = line
End Function

With WScript.Arguments
  If .Count <> 1 Then
    WScript.Echo "Index is out of range."
    WScript.Quit(1)
  End If
 
  WScript.Echo SelectString(.Unnamed(0))
End With


Iska 07-06-2015 16:05 2515732

Цитата:

Цитата God-of-Chaos
максимум может быть 9999 значений, но на первое время несколько сотен будет, не больше, »

Тогда вопрос о производительности не стоит, и гож тот код, что приведён выше коллегой greg zakharov.

Если же Вам актуально исключительно на VBScript, то, надо полагать, Вас интересует функция, дабы пользовать её где-то в другом коде?
Например
Код:

Option Explicit

WScript.Echo "[" & FindRecordByNum("C:\Мои проекты\10\listprint1.txt", 5555) & "]"
WScript.Echo "[" & FindRecordByNum("C:\Мои проекты\10\listprint1.txt", 1234) & "]"
WScript.Echo "[" & FindRecordByNum("C:\Мои проекты\10\listprint1.txt", 1111) & "]"

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

'=============================================================================
Function FindRecordByNum(strSourceFile, lngNumber)
        Dim arrContent
       
        FindRecordByNum = ""
       
        With WScript.CreateObject("Scripting.FileSystemObject")
                If .FileExists(strSourceFile) Then
                        With .OpenTextFile(strSourceFile)
                                arrContent = Filter(Split(.ReadAll(), vbCrLf), CStr(lngNumber) & ",")
                                .Close
                        End With
                       
                        If UBound(arrContent) >= 0 Then
                                FindRecordByNum = arrContent(0)
                        End If
                Else
                        WScript.Echo "Source file [" & strSourceFile & "] not found."
                End If
        End With
End Function
'=============================================================================


И ещё: пример в первом посте — с заголовками, выложенный образец файла — без. Что следует считать верным?

Цитата:

Цитата God-of-Chaos
в дальнейшем список должен быть перенесен в базу, и запрос делаться в базу для получения строки...головная боль в будущем будет »

В принципе, ADODB позволяет пользовать текстовый CSV файл как базу данных. Ещё быстрее работает LogParser.

God-of-Chaos 07-06-2015 16:14 2515737

Цитата:

Цитата Iska
пример в первом посте — с заголовками, выложенный образец файла — без. Что следует считать верным? »

Верный без заголовков, это я для примера их в первом посте указал

Скорее всего база будет в SQL, с некой веб мордой и запрос делать придется через http запрос


greg zakharov, Iska, Спасибо за примеры. Завтра постараюсь попробовать проверить и применить их.

Цитата:

Цитата Iska
то, надо полагать, Вас интересует функция, дабы пользовать её где-то в другом коде? »

Нет, необязательно функцией)

greg zakharov 07-06-2015 16:17 2515738

Iska, какбэ... на счет производительности вроде бы речи не велось. Если это критичный параметр, то для быстрой обработки файла вариантов решения довольно много.
А вообще для работы с CSV более разумней использовать PowerShell.

Iska 07-06-2015 16:46 2515743

Цитата:

Цитата greg zakharov
то для быстрой обработки файла вариантов решения довольно много.
»

Для быстрой обработки альтернатив ADODB/LogParser нет мне неизвестно.

Цитата:

Цитата greg zakharov
А вообще для работы с CSV более разумней использовать PowerShell. »

Не вижу в этом принципиального смысла. Язык — всего лишь язык.

greg zakharov 07-06-2015 17:24 2515751

Цитата:

Цитата Iska
Для быстрой обработки альтернатив ADODB/LogParser нет мне неизвестно.

То, что кому-то неизвестно, вполне известно другим. В качестве альтернативы ADODB можно использовать SAPI.SpFileStream.
Цитата:

Цитата Iska
Не вижу в этом принципиального смысла. Язык — всего лишь язык.

Язык языку рознь.

Iska 07-06-2015 19:06 2515773

Цитата:

Цитата greg zakharov
То, что кому-то неизвестно, вполне известно другим. В качестве альтернативы ADODB можно использовать SAPI.SpFileStream. »

И как с помощью «SAPI.SpFileStream» получить потребную запись в данном файле? Буде он состоять действительно не из сотен, а сотен тысяч строк?

Цитата:

Цитата greg zakharov
Язык языку рознь. »

Так поделитесь этой принципиальной рознью ;).


Время: 21:34.

Время: 21:34.
© OSzone.net 2001-