PDA

Показать полную графическую версию : поиск значения в текстовом файле и выбор данной строки


God-of-Chaos
07-06-2015, 05:21
кто силен в vbs, помогите решить задачку...

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

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

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

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

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

greg zakharov
07-06-2015, 07:15
В заголовке темы указано 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
В заголовке темы указано WSH/VBScript/JS, в посте - vbs »
Начало заголовка выбирается из предопределённого перечня в качестве категории:
http://i.imgur.com/zbWQ97E.png

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

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

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

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

God-of-Chaos
07-06-2015, 15:12
Упакуйте образец такого файла в архив. Прикрепите архив к сообщению или выложите на RGhost. »

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

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

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

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

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

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

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

greg zakharov
07-06-2015, 15:51
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
максимум может быть 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
'=============================================================================

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

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

God-of-Chaos
07-06-2015, 16:14
пример в первом посте — с заголовками, выложенный образец файла — без. Что следует считать верным? »

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

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


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

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

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

greg zakharov
07-06-2015, 16:17
Iska, какбэ... на счет производительности вроде бы речи не велось. Если это критичный параметр, то для быстрой обработки файла вариантов решения довольно много.
А вообще для работы с CSV более разумней использовать PowerShell.

Iska
07-06-2015, 16:46
то для быстрой обработки файла вариантов решения довольно много.
»
Для быстрой обработки альтернатив ADODB/LogParser нет мне неизвестно.

А вообще для работы с CSV более разумней использовать PowerShell. »
Не вижу в этом принципиального смысла. Язык — всего лишь язык.

greg zakharov
07-06-2015, 17:24
Для быстрой обработки альтернатив ADODB/LogParser нет мне неизвестно.То, что кому-то неизвестно, вполне известно другим. В качестве альтернативы ADODB можно использовать SAPI.SpFileStream.
Не вижу в этом принципиального смысла. Язык — всего лишь язык.Язык языку рознь.

Iska
07-06-2015, 19:06
То, что кому-то неизвестно, вполне известно другим. В качестве альтернативы ADODB можно использовать SAPI.SpFileStream. »
И как с помощью «SAPI.SpFileStream» получить потребную запись в данном файле? Буде он состоять действительно не из сотен, а сотен тысяч строк?

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




© OSzone.net 2001-2012