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

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программное обеспечение Windows (http://forum.oszone.net/forumdisplay.php?f=7)
-   -   Нужна программа, выдергивания текста... (http://forum.oszone.net/showthread.php?t=225529)

BMW09121985 17-01-2012 21:45 1838359

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

Казбек 17-01-2012 22:13 1838393

BMW09121985,
http://en.wikipedia.org/wiki/Compari...mparison_tools
Сравнение файлов - Compare, Merge
http://forum.ru-board.com/topic.cgi/...=1244&start=80

Iska 17-01-2012 23:30 1838461

BMW09121985, не очень понятен вопрос. Перефразируйте на примере.

BMW09121985 18-01-2012 02:57 1838521

Цитата:

Цитата Iska
не очень понятен вопрос. Перефразируйте на примере. »

К примеру:
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 1838527

То есть, найти во втором файле все строки, которые отсутствуют в первом файле? Тогда так:
Код:

findstr.exe /v /g:"0001.txt" "0002.txt"

BMW09121985 18-01-2012 03:34 1838532

Цитата:

Цитата Iska
findstr.exe »

это файл есть по умолчанию в системе ?
И куда потом выводится результат ?

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

Iska 18-01-2012 10:43 1838657

Цитата:

Цитата BMW09121985
это файл есть по умолчанию в системе ? »

Да:
Код:

C:\WINDOWS\system32\findstr.exe
Цитата:

Цитата BMW09121985
И куда потом выводится результат ? »

На консоль, но можно и перенаправить вывод, например, в файл:
Код:

findstr.exe /v /g:"0001.txt" "0002.txt" >"0003.txt"

BMW09121985 18-01-2012 13:44 1838815

Цитата:

Цитата Iska
На консоль, но можно и перенаправить вывод, например, в файл: »

Вообще супер!!!
Благодарочка :victory:

BMW09121985 05-12-2012 03:42 2038918

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

Iska 05-12-2012 13:31 2039127

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

бУРов 05-12-2012 14:56 2039185

А мне можно эти образцы получить? Задача заинтересовала. Если там "персональная" инфа, то не надо, конечно.

Iska 05-12-2012 21:09 2039453

Из письма в PM:
Цитата:

Цитата BMW09121985
Привет, ну что там ?

Поскольку ответить мне не удалось по причине:
Цитата:

BMW09121985 превысил(а) максимальный объем сохраненных персональных сообщений и не может получать новые сообщения, пока не удалит часть старых.
— оставляю текст своего неотправленного письма тут:

Цитата:

Цитата Iska
В процессе. Занимаюсь. Пока что подтверждаю сам факт проблемы.


BMW09121985 05-12-2012 21:28 2039466

Iska, Ок, а то я вообще ума не приложу, почему так !

Iska 05-12-2012 21:57 2039481

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 2039491

Iska, А можно подробнее об этом использовании ?
Я в скриптах 0 !

Iska 06-12-2012 00:09 2039553

Сохраняете приведённый выше код в файл с расширением «.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 2039581

Iska,
Цитата:

Цитата Iska
Насколько я понял, этот Код:
findstr.exe /v /g:"0001.txt" "0002.txt" >"0003.txt" »

должен быть в батнике..


а тут ->
Цитата:

Цитата Iska
В качестве обходного пути предлагаю попробовать скрипт WSH:
« скрыть »

файлик с расширением vbs .

Iska 06-12-2012 01:56 2039594

Вложений: 1
BMW09121985, так: Файл 90961 понятнее?

BMW09121985 06-12-2012 01:58 2039596

Iska, Да, у меня уже получилось! Огромное спасибо!

Iska 06-12-2012 02:03 2039598

BMW09121985, успехов! «Свистите», ежели что.

Amiranchik 06-12-2012 02:08 2039599

Iska, отлично, сам не знал такого способа, взял на заметку, вдруг пригодится. :) Благодарю!

BMW09121985 06-12-2012 14:10 2039891

Цитата:

Цитата Iska
BMW09121985, успехов! «Свистите», ежели что. »

НЕ долго я радовался!
Свищу!
Теперь вот такая вот проблема:
0001.txt 42167строк
0002.txt 44055строк
Получается что 0003.txt должен быть 1888строк, а в нем 1905!

Что, отсылать вам файлики ?

Iska 06-12-2012 16:57 2040013

Цитата:

Цитата BMW09121985
Получается что 0003.txt должен быть 1888строк, а в нем 1905! »

Что насчёт дубликатов строк в результирующем файле? Они есть?

Цитата:

Цитата BMW09121985
Что, отсылать вам файлики ? »

А как же?! Конечно, отсылайте. Всё равно я Ваши шифровки не сумею расшифровать ;).

BMW09121985 06-12-2012 19:20 2040115

Iska, отправил!
Мои шифровки расшифрованы в шапке :)

Iska 06-12-2012 19:58 2040138

BMW09121985, получил, проверил. Не вижу ошибок. Выходной файл — 1905 строк. Из тех строк файла «0002.txt», которые отсутствуют в «0001.txt».

Как Вы определяли, что должно быть 1888 строк?

BMW09121985 06-12-2012 20:02 2040139

Цитата:

Цитата Iska
Как Вы определяли, что должно быть 1888 строк? »

44055 строк - 42167 строк = 1888 строк

Iska 06-12-2012 20:13 2040156

Выполните «2.cmd», в котором источник и фильтр поменяны местами:
Код:

cscript.exe //nologo SomeScript.vbs /Source:0001.txt /Filter:0002.txt 1>0004.txt
Содержимое «0004.txt» будет состоять из строк файла «0001.txt», которые отсутствуют в «0002.txt». У меня таких набралось 17 штук. Понимаете? В файле «0001.txt» есть строки, которых нет в «0002.txt». Потому 1888 в результате исполнения «1.bat» никак набраться не может:
Код:

1888+17=1905
;).

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

BMW09121985 06-12-2012 21:42 2040210

Цитата:

Цитата Iska
P.S. Все эти арифметические выкладки, разумеется, справедливы до тех пор, пока в файлах нет дубликатов. »

Дело в том, что до этой операции я файлики проганяю через Text Duplicate Killer , и еще раз проверил, нету там никаких дубликатов, а в тех 17 строках, такие данные, которых вообще не может быть, так как бы оторванные цифры ..

Iska 06-12-2012 22:25 2040246

Цитата:

Цитата BMW09121985
Дело в том, что до этой операции я файлики проганяю через Text Duplicate Killer , и еще раз проверил, нету там никаких дубликатов, »

Я это тоже проверял. Дубликатов нет.

Цитата:

Цитата BMW09121985
а в тех 17 строках, такие данные, которых вообще не может быть, так как бы оторванные цифры .. »

Сочувствую Вашему горю, но ничем помочь не могу: «105» — строка №2007, «10949» — строка №2824 и т.д.

Из письма в PM:
Цитата:

Цитата BMW09121985
А может быть такое, если в одном файле есть к примеру 10949 а в другом 1094911, то в итоге скрипт посчитает что это не разные, а одинаковые ?

Нет, не может. Главное — чтобы пробелов не было слева/справа, хотя и это можно будет учесть, если потребуется.

KooDI 07-12-2012 21:57 2040948

Доброго времени суток.
Отличный способ.
Похожая ситуация, не хотел создавать отдельную тему, есть файл в котором текст в колонку.
Как можно сделать, так что б к каждому рядку в начале текста добавить то что мне надо.

Пример
читать дальше »
Было
1234
5678
Стало
Вася_1234
Вася_5678
и так дале

Iska 08-12-2012 00:25 2041036

Код:

for /f "delims=" %%i in (FileIn.txt) do echo Вася_%%i>>FileOut.txt

BMW09121985 10-12-2012 13:37 2042372

Iska, Может не по теме, хотел спросить, как можно разделить текстовый файл на несколько с нужным количеством ?
К примеру есть файл с 2052 строк, а мне надо его разделить на 36 файликов по 57 строк!

Iska 10-12-2012 18:11 2042568

Цитата:

Цитата BMW09121985
Может не по теме »

Не по теме. На будущее: принято так — «Один вопрос — одна тема».

читать дальше »
Код:

Option Explicit

Dim strSourceFile
Dim strDestFile

Dim lngLines
Dim i
Dim lngFileNumber

Dim objTSSource
Dim objTSDest

Dim strLine


strSourceFile = "C:\Песочница\008\Source.txt"
strDestFile  = "C:\Песочница\008\Destination$.txt"


lngLines      = 57
i            = 0
lngFileNumber = 0

With WScript.CreateObject("Scripting.FileSystemObject")
        Set objTSSource = .OpenTextFile(strSourceFile)
        Set objTSDest  = .CreateTextFile(Replace(strDestFile, "$", CStr(lngFileNumber)), True)
       
        Do Until objTSSource.AtEndOfStream
                strLine = objTSSource.ReadLine()
                i = i + 1
               
                If i > lngLines Then
                        objTSDest.Close
                       
                        i = 1
                        lngFileNumber = lngFileNumber + 1
                       
                        Set objTSDest = .CreateTextFile(Replace(strDestFile, "$", CStr(lngFileNumber)), True)
                End If
               
                objTSDest.WriteLine strLine
        Loop
       
        objTSDest.Close
        objTSSource.Close
       
        Set objTSDest  = Nothing
        Set objTSSource = Nothing
End With

WScript.Quit 0


softter 10-12-2012 19:02 2042608

Цитата:

Цитата BMW09121985
К примеру есть файл с 2052 строк, а мне надо его разделить на 36 файликов по 57 строк! »


Cut Mail list - режет файлы со строковыми данными на более мелкие части. Правда делалась для разделки е-майл листов и минимальное число строк 200. Если есть желание скину исходник, перекомпилируете сами.

KooDI 18-02-2014 11:55 2311003

Доброго времени суток
Iska, пожалуйста можете подправить этот код так чтоб можно было на кнопку в тотале повесить.
Код с поста #33

Iska 18-02-2014 12:55 2311034

KooDI, посмотрю ночью.

Iska 19-02-2014 07:00 2311559

Посмотрел.

E:\Песочница\0363\SplitTextFile.vbs:
читать дальше »
Код:

Option Explicit

Dim strSourceFile
Dim strDestFile

Dim strLines
Dim lngLines
Dim i
Dim lngFileNumber

Dim objTSSource
Dim objTSDest

Dim strLine


If WScript.Arguments.Count = 1 Then
        With WScript.CreateObject("Scripting.FileSystemObject")
                strSourceFile = .GetAbsolutePathName(WScript.Arguments.Item(0))
               
                If .FileExists(strSourceFile) Then
                        strDestFile = .BuildPath(.GetParentFolderName(strSourceFile), .GetBaseName(strSourceFile) & "|." & .GetExtensionName(strSourceFile))
                       
                        strLines = Trim(InputBox("Enter lines count:", "Lines count", 50))
                       
                        If strLines <> "" Then
                                lngLines = CLng(strLines)
                                i = 0
                                lngFileNumber = 1
                               
                                Set objTSSource = .OpenTextFile(strSourceFile)
                                Set objTSDest  = .CreateTextFile(Replace(strDestFile, "|", CStr(lngFileNumber)), True)
                               
                                Do Until objTSSource.AtEndOfStream
                                        strLine = objTSSource.ReadLine()
                                        i = i + 1
                                       
                                        If i > lngLines Then
                                                objTSDest.Close
                                               
                                                i = 1
                                                lngFileNumber = lngFileNumber + 1
                                               
                                                Set objTSDest = .CreateTextFile(Replace(strDestFile, "|", CStr(lngFileNumber)), True)
                                        End If
                                       
                                        objTSDest.WriteLine strLine
                                Loop
                               
                                objTSDest.Close
                                objTSSource.Close
                               
                                Set objTSDest  = Nothing
                                Set objTSSource = Nothing
                        End If
                Else
                        WScript.Echo "Source file [" & strSourceFile & "] not found."
                        WScript.Quit 2
                End If
        End With
Else
        WScript.Echo "Usage: wscript.exe " & WScript.ScriptName & " <Source file>"
        WScript.Quit 1
End If

WScript.Quit 0



Настройки кнопки обычны:

KooDI 19-02-2014 23:07 2312120

Ого даже так, это просто супер, спасибо огромное, один универсальный скрипт, можно задавать сколько надо строк в окошечке, не думал что так можно...)
Можете подсазать в какой строке и где подставить(если это не сложно, и не надо весь код скрипта изменять) символ _, что б было с суфиксом _1, _2, _3...?

Iska 20-02-2014 01:03 2312171

Цитата:

Цитата KooDI
Можете подсазать в какой строке и где подставить(если это не сложно, и не надо весь код скрипта изменять) символ _, что б было с суфиксом _1, _2, _3...? »

Здесь:
Код:

strDestFile = .BuildPath(.GetParentFolderName(strSourceFile), .GetBaseName(strSourceFile) & "_|." & .GetExtensionName(strSourceFile))


Время: 08:43.

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