PDA

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


Страниц : [1] 2

BMW09121985
17-01-2012, 21:45
Доброго времени суток!!!
Натолкнулся на проблему, которую не хочется решать вручную....
Объясняю что надо :
У меня есть 2 файла в которых набор id (это id людей из контакта) столбиком ...
Мне надо, чтобы программа отсканировала 2 файла и выдала мне,
какие id из двух файлов не повторяются во втором файле , но и не обращала внимания
на id которые не повторяются в первом.

Казбек
17-01-2012, 22:13
BMW09121985,
http://en.wikipedia.org/wiki/Comparison_of_file_comparison_tools
Сравнение файлов - Compare, Merge
http://forum.ru-board.com/topic.cgi/реклама/board/temp/ideco-software/%3Csmall%3Eftp://ftp.kddlabs.co.jp/WinSite/winxp/pim/ab2003.zip%3C/%3Cb%3Ewww.MultiDVD.org%3C/реклама/forall/xntx/html/-/webfile.ru/unattended.oszone.net/topic.cgi?forum=5&topic=1244&start=80

Iska
17-01-2012, 23:30
BMW09121985, не очень понятен вопрос. Перефразируйте на примере.

BMW09121985
18-01-2012, 02:57
не очень понятен вопрос. Перефразируйте на примере. »
К примеру:
1 файл_:_________________2 файл:
15432546_______________1968546
11122254_______________16985645
16489562_______________15432546
18564592_______________13546985_______________Мне теперь надо айдишки из второго файла, которых нету в первом - > 1968546, 13546985 , 136599852,
16526985_______________136599852_______________136599452,1566486418 ....
16985645_______________136599452
13265844_______________1566486418

Iska
18-01-2012, 03:13
То есть, найти во втором файле все строки, которые отсутствуют в первом файле? Тогда так:
findstr.exe /v /g:"0001.txt" "0002.txt"

BMW09121985
18-01-2012, 03:34
findstr.exe »
это файл есть по умолчанию в системе ?
И куда потом выводится результат ?

РАЗОБРАЛСЯ, огромнейшее спасибо !!!! :clapping:

Iska
18-01-2012, 10:43
это файл есть по умолчанию в системе ? »
Да:
C:\WINDOWS\system32\findstr.exe

И куда потом выводится результат ? »
На консоль, но можно и перенаправить вывод, например, в файл:
findstr.exe /v /g:"0001.txt" "0002.txt" >"0003.txt"

BMW09121985
18-01-2012, 13:44
На консоль, но можно и перенаправить вывод, например, в файл: »
Вообще супер!!!
Благодарочка :victory:

BMW09121985
05-12-2012, 03:42
Iska, Привет!
Столкнулся с проблемкой!
К примеру есть 2 файла 0001.txt (3500 строк) и 0002.txt (4000 строк), теоретически в 0003.txt должно быть 500 строк но там меньше !
Уже долго пользуюсь этим батником и только сегодня заметил такую проблемку!

Iska
05-12-2012, 13:31
Упакованные в архив образцы файлов «0001.txt (3500 строк)», «0002.txt (4000 строк)» и «должно быть 500 строк» — в личку.

бУРов
05-12-2012, 14:56
А мне можно эти образцы получить? Задача заинтересовала. Если там "персональная" инфа, то не надо, конечно.

Iska
05-12-2012, 21:09
Из письма в PM:
Привет, ну что там ?
Поскольку ответить мне не удалось по причине:
BMW09121985 превысил(а) максимальный объем сохраненных персональных сообщений и не может получать новые сообщения, пока не удалит часть старых.
— оставляю текст своего неотправленного письма тут:
В процессе. Занимаюсь. Пока что подтверждаю сам факт проблемы.

BMW09121985
05-12-2012, 21:28
Iska, Ок, а то я вообще ума не приложу, почему так !

Iska
05-12-2012, 21:57
BMW09121985, факт подтверждаю. Причины мне не ясны: обычный текст, состоящий из банальных цифр, нет проблем с концами строк. Не знаю, на что можно грешить во входных данных.

В качестве обходного пути предлагаю попробовать скрипт WSH:
Option Explicit

Const SystemFolder = 1
Const ForWriting = 2

Dim lngErrCode

Dim objFSO

Dim strSourceFile
Dim strFilterFile

Dim objDictionary
Dim strLine


lngErrCode = 0

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

If UCase(WScript.FullName) = UCase(objFSO.BuildPath(objFSO.GetSpecialFolder(SystemFolder), "cscript.exe")) Then
If WScript.Arguments.Count = 2 Then
If WScript.Arguments.Named.Exists("Source") Then
strSourceFile = WScript.Arguments.Named.Item("Source")

If WScript.Arguments.Named.Exists("Filter") Then
strFilterFile = WScript.Arguments.Named.Item("Filter")

If objFSO.FileExists(strSourceFile) Then
If objFSO.FileExists(strFilterFile) Then
Set objDictionary = WScript.CreateObject("Scripting.Dictionary")

With objFSO
With .OpenTextFile(strFilterFile)
Do Until .AtEndOfStream
strLine = .ReadLine()

If Not objDictionary.Exists(strLine) Then
objDictionary.Add strLine, strLine
End If
Loop

.Close
End With

With .OpenTextFile(strSourceFile)
Do Until .AtEndOfStream
strLine = .ReadLine()

If Not objDictionary.Exists(strLine) Then
WScript.StdOut.WriteLine strLine
End If
Loop

.Close
End With
End With

objDictionary.RemoveAll
Set objDictionary = Nothing
Else
WScript.StdErr.WriteLine "Filter file [" & strFilterFile & "] not found"
ShowUsage 6
End If
Else
WScript.StdErr.WriteLine "Source file [" & strSourceFile & "] not found"
ShowUsage 5
End If

Set objFSO = Nothing
Else
ShowUsage 4
End If
Else
ShowUsage 3
End If
Else
ShowUsage 2
End If
Else
MsgBox "Usage: cscript.exe //nologo " & WScript.ScriptName & " /Source:<Source file> /Filter:<Filter file>", _
vbExclamation + vbOKOnly, "Error: Use «cscript.exe» executable instead of «wscript.exe»"
lngErrCode = 1
End If

WScript.Quit lngErrCode
'=============================================================================

'=============================================================================
Sub ShowUsage(lngSetErrCode)
WScript.StdErr.WriteLine "Usage: cscript.exe //nologo " & WScript.ScriptName & " /Source:<Source file> /Filter:<Filter file>"
lngErrCode = lngSetErrCode
End Sub
'=============================================================================

На Вашем примере это может выглядеть так:
cscript.exe //nologo SomeScript.vbs /Source:0002.txt /Filter:0001.txt 1>0003.txt

BMW09121985
05-12-2012, 22:17
Iska, А можно подробнее об этом использовании ?
Я в скриптах 0 !

Iska
06-12-2012, 00:09
Сохраняете приведённый выше код в файл с расширением «.vbs», например «SomeScript.vbs». Можно использовать Блокнот.

Возможно, самым простым для Вас будет использовать пакетный файл, подобный ранее использовавшемуся:
findstr.exe /v /g:"0001.txt" "0002.txt" >"0003.txt"
в котором Вы пишете, например:
cscript.exe //nologo SomeScript.vbs /Source:0002.txt /Filter:0001.txt 1>0003.txt
где «SomeScript.vbs» — имя скрипта, «0002.txt» — имя исходного файла, «0001.txt» — имя файла-фильтра, строки которого «фильтруют» исходный файл так, чтобы на выходе остались только те строки из «0002.txt», которых нет в «0001.txt».

«1>0003.txt» — обычное перенаправление вывода stdout скрипта в файл.

Разумеется, можно указывать пути, а не только имена. При наличии пробелов и т.п. в именах/путях — заключайте их в кавычки.

BMW09121985
06-12-2012, 00:53
Iska,
Насколько я понял, этот Код:
findstr.exe /v /g:"0001.txt" "0002.txt" >"0003.txt" »
должен быть в батнике..


а тут -> В качестве обходного пути предлагаю попробовать скрипт WSH:
« скрыть » файлик с расширением vbs .

Iska
06-12-2012, 01:56
BMW09121985, так: 90961 понятнее?

BMW09121985
06-12-2012, 01:58
Iska, Да, у меня уже получилось! Огромное спасибо!

Iska
06-12-2012, 02:03
BMW09121985, успехов! «Свистите», ежели что.




© OSzone.net 2001-2012