Компьютерный форум 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=150969)

VladZombie 19-09-2009 19:39 1222704

Удаление строк в текстовом файле, как это сделать???
 
Лежит папка а в ней все отчёты в текстовом виде, так вот надо удалить со всех текстовых документах строки где есть слова "mozila" как это сделать? Нашёл вот это
HTML код:

type your_file.txt | findstr /v firefox.exe > temp.txt del your_file.txt rename temp.txt your_file.txt
но он не удаляет ((((

gora 19-09-2009 20:30 1222745

Цитата:

Цитата VladZombie
но он не удаляет »

а если так:
Код:

type your_file.txt | findstr /i /v "mozila" > temp.txt
del your_file.txt
rename temp.txt your_file.txt


Rezan0FF 13-01-2012 06:32 1834506

этот код удаляет если батник и файл лежат в одном каталоге, а как сделать, чтобы можно было удалить эту строчку со всех файлов с именем your_file.txt лежащих в этом каталоге и подкаталогов. Например со всего диска d?

shao 05-03-2012 02:39 1872561

Коллеги , а как удалить символ в текстовом файле.
Нужно во всём тексте удалить кавычки. Везде...все...

gora 05-03-2012 14:39 1872814

shao, попробуйте так:
Код:

@Echo Off
SetLocal EnableDelayedExpansion
:: Обрабатываемый файл
Set file=e:\Temp\TC8setup_config.txt
:: Новый файл
Set newfile=e:\Temp\temp.txt

(For /f "usebackq delims=" %%a In ("%file%") Do (
        Set ta=%%a
        Echo !ta:"=!
))>"%newfile%"
Pause>Nul

Ограничения:
Пустые строки удаляются
Текст не должен содержать восклицательные знаки "!".

vovanwildbees 02-02-2015 16:30 2465291

Здравствуйте, помогите пожалуйста решить задачу

Есть текстовый файл содержащий большое количество строк
нужно удалить строки содержащие определенные слова

пробовал это:
@echo off
SetLocal EnableExtensions EnableDelayedExpansion
set src=1.txt
set dest=1_1.txt
set seek=нужные слова
2>nul del "%dest%"
find /i "%seek%" < "%src%" > "%src%_"
exit /B

и вот это:
@echo off
type 1.txt | find /v /i "Ненужное слово" > file.temp
echo.Y | move file.temp 2.txt

строки удаляются корректно, но:
есть символ в виде квадрата, в начале каждой строки, как я понял это символ переноса строки,

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

Что нужно добавить чтобы символ оставался нетронутым?

Iska 02-02-2015 16:46 2465300

Цитата:

Цитата vovanwildbees
Есть текстовый файл содержащий большое количество строк »

Цитата:

Цитата vovanwildbees
строки удаляются корректно, но:
есть символ в виде квадрата, в начале каждой строки, как я понял это символ переноса строки, »

Упакуйте файл в архив. Архив выложите на RGhost — файлообменник. Ссылку на выложенный архив — сюда.

vovanwildbees 03-02-2015 15:55 2465794

Iska спасибо что отозвались
вот файл http://rghost.ru/7DWx7YfvZ

"квадратики" видны только в стандартном блокноте

Iska 03-02-2015 16:02 2465801

vovanwildbees, «квадратики» — это обычная табуляция. Надеюсь, коллеги теперь напишут потребное Вам.

gora 03-02-2015 16:13 2465811

Цитата:

Цитата vovanwildbees
"квадратики" видны только в стандартном блокноте »

1 Ни каких квадратиков в стандартном Блокноте не вижу. :( (win7 х64)
Цитата:

Цитата vovanwildbees
есть символ в виде квадрата, в начале каждой строки, »

Это вряд ли про табуляцию, ибо в предложенном файле их (09h) 830 штук в пяти строках.
Из необычного: в конце каждой строки только 0Ah, а "парный" 0Dh отсутствует.
Может речь идет про этот символ?

Iska 03-02-2015 16:25 2465819

Цитата:

Цитата gora
Это вряд ли про табуляцию, ибо в предложенном файле их (09h) 830 штук в пяти строках.
Из необычного: в конце каждой строки только 0Ah, а "парный" 0Dh отсутствует. »

Точно. «Lf» есть, «Cr» нету. Unix-like style. А я просто-напросто попутал.

vovanwildbees 04-02-2015 10:16 2466109

Скриншот http://rghost.ru/8jFBLgQHX

Iska 04-02-2015 20:48 2466452

vovanwildbees, честно говоря, я сомневаюсь, что сие возможно сугубо пакетными файлами. Тут либо портированные из Unix утилиты типа sed, либо PoSH.

vovanwildbees 16-02-2015 16:21 2472031

Спасибо! Вопрос можно снять с обсуждения.

daradan 09-10-2015 05:46 2562089

Подскажите пожалуйста.
Как удалить текст, в которой содержатся кавычки?
в файлах
Код:

\*\content\launcher\meta.json
\*\content\lockscreen\meta.json
\*\meta.json

где * динамическое название папки. Пример
Скрытый текст
Код:

\620\content\launcher\meta.json
\620\content\lockscreen\meta.json
\620\meta.json

\790\content\launcher\meta.json
\790\content\lockscreen\meta.json
\790\meta.json

необходимо удалить текст
Код:

,"is_Download_by_Period":true
Спасибо

Foreigner 09-10-2015 08:09 2562110

Код:

@echo off
setlocal

for /f "tokens=*" %%i in ('dir /b /s "C:\Start Folder\meta.json"') do (

    sed "s/,\"is_Download_by_Period\":true//" "%%i" 1> "%tmp%\%%~nxi"
    move "%tmp%\%%~nxi" "%%i"

)


daradan 09-10-2015 08:29 2562118

ForeignerСпасибо, но правильно ли я сделал?
создал в корне (где лежат произвольные папки) файл с расширением cmd и скопировал ваш скрипт. Запустил, выводит ошибку
HTML код:

Не удается найти файл 'dir /b /s "C:\Start Folder\meta.json".
Вроде разобрался. Спасибо еще раз. Не хватало знака ' после meta.json"

SharkyEXE 25-08-2018 19:16 2828489

Всем здравствуйте.

Оригинальынй файл bouquets.tv , из которого надо удалить строку #SERVICE 1:7:1:0:0:0:0:0:0:0:FROM BOUQUET "userbouquet.LastScanned.tv" ORDER BY bouquet
Скрытый текст
Код:

#NAME User - bouquets (TV)
#SERVICE 1:7:1:0:0:0:0:0:0:0:FROM BOUQUET "userbouquet.dbe01.tv" ORDER BY bouquet
#SERVICE 1:7:1:0:0:0:0:0:0:0:FROM BOUQUET "userbouquet.dbe02.tv" ORDER BY bouquet
#SERVICE 1:7:1:0:0:0:0:0:0:0:FROM BOUQUET "userbouquet.dbe03.tv" ORDER BY bouquet
#SERVICE 1:7:1:0:0:0:0:0:0:0:FROM BOUQUET "userbouquet.dbe04.tv" ORDER BY bouquet
#SERVICE 1:7:1:0:0:0:0:0:0:0:FROM BOUQUET "userbouquet.favourites.tv" ORDER BY bouquet
#SERVICE 1:7:1:0:0:0:0:0:0:0:FROM BOUQUET "userbouquet.dbe06.tv" ORDER BY bouquet
#SERVICE 1:7:1:0:0:0:0:0:0:0:FROM BOUQUET "userbouquet.dbe05.tv" ORDER BY bouquet
#SERVICE 1:7:1:0:0:0:0:0:0:0:FROM BOUQUET "userbouquet.LastScanned.tv" ORDER BY bouquet


Поправил этот код тынц для себя
Скрытый текст
Код:

type bouquets.tv | findstr /i /v "#SERVICE 1:7:1:0:0:0:0:0:0:0:FROM BOUQUET "userbouquet.LastScanned.tv"" > temp_bouquets.tv
del bouquets.tv
rename temp_bouquets.tv bouquets.tv


После отработки - пустой файл bouquets.tv размером 0 , внутри пусто
Пожалуйста , помогите мне
Спасибо.

Iska 25-08-2018 19:45 2828495

Код:

@echo off
setlocal enableextensions enabledelayedexpansion

type "bouquets.tv" | >"temp_bouquets.tv" findstr /i /v /l /c:"#SERVICE 1:7:1:0:0:0:0:0:0:0:FROM BOUQUET \"userbouquet.LastScanned.tv\""

del "bouquets.tv"
rename "temp_bouquets.tv" "bouquets.tv"

endlocal
exit /b 0


v79italya 23-03-2020 20:49 2914402

Доброго времени суток
Скажите пожалуйста, каким vbs-скриптом можно удалить в файлах CSV строки, содержащие null(в строке дата и только null-и)
HTML код:

2020-02-04,4.010000,4.020000,3.990000,3.990000,3.990000,314769
2020-02-05,4.000000,4.000000,3.990000,3.990000,3.990000,350516
2020-02-06,3.990000,4.010000,3.990000,3.990000,3.990000,353542
2020-02-07,4.000000,4.010000,4.000000,4.000000,4.000000,744968
2020-02-10,4.000000,4.000000,4.000000,4.000000,4.000000,0
2020-02-11,null,null,null,null,null,null
2020-02-12,null,null,null,null,null,null
2020-02-13,null,null,null,null,null,null
2020-02-14,null,null,null,null,null,null
2020-02-18,null,null,null,null,null,null
2020-02-19,null,null,null,null,null,null
2020-02-20,null,null,null,null,null,null

Папка с файлами находится по адресу: D:\Новая папка

Можно еще одну проблему решить. Есть множество файлов тхт такого вида:
HTML код:

10000530155:angry_ele.03
10000564625:biloshka1448
10000605518:ruslan.ahm04

Как удалить все после первого двоеточия вместе с двоеточием?

Iska 23-03-2020 21:18 2914405

Цитата:

Цитата v79italya
в файлах CSV »

…образцы нескольких из которых Вы упаковали в архив, каковой и приложили к сообщению?

Цитата:

Цитата v79italya
строки, содержащие null(в строке дата и только null-и) »

Любые строки с null? Или строго: первая часть — дата, и все остальные части — все null?

Цитата:

Цитата v79italya
Есть множество файлов тхт такого вида »

…образцы нескольких из которых Вы также упаковали в архив, каковой и приложили к сообщению?

v79italya 23-03-2020 21:31 2914408

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

Цитата Iska
Или строго: первая часть — дата, и все остальные части — все null? »

Лучше строго. Удалить строки, в которых идет сначала дата, а потом null-и

Iska 23-03-2020 22:10 2914413

Цитата:

Цитата v79italya
каким vbs-скриптом можно удалить в файлах CSV строки, содержащие null(в строке дата и только null-и) »

Попробуйте так:
Скрытый текст
Код:

Option Explicit

Dim strSourceFolder

Dim objFSO
Dim objFile
Dim strContent


If WScript.Arguments.Count = 1 Then
        strSourceFolder = WScript.Arguments.Item(0)
       
        Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
       
        If objFSO.FolderExists(strSourceFolder) Then
                For Each objFile In objFSO.GetFolder(strSourceFolder).Files
                        If StrComp(objFSO.GetExtensionName(objFile.Name), "csv", 0) = 0 Then
                                Dim objTS
                               
                                With objFSO.OpenTextFile(objFile.Path)
                                        strContent = .ReadAll()
                                        .Close
                                End With
                               
                                With WScript.CreateObject("VBScript.RegExp")
                                        .Pattern = "\n\d{4}-\d{2}-\d{2},null,null,null,null,null,null"
                                        .Global = True
                                       
                                        If .Test(strContent) Then
                                                strContent = .Replace(strContent, "")
                                               
                                                With objFSO.CreateTextFile(objFile.Path, True)
                                                        .Write strContent
                                                        .Close
                                                End With
                                        End If
                                End With
                        Else
                                ' Nothing to do
                        End If
                Next
        Else
                WScript.Echo "Can't find source folder [" & strSourceFolder & "]."
                WScript.Quit 2
        End If
       
        Set objFSO = Nothing
Else
        WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ <Source folder>"
        WScript.Quit 1
End If

WScript.Quit 0


Путь к целевому каталогу задаётся параметром скрипта (также можно просто перетащить папку на скрипт в Проводнике). Из каталога выбираются все .csv-файлы.

v79italya 23-03-2020 22:26 2914416

Iska, спасибо за скрипт. А можно путь к папке задать?
Еще я сразу написал что нужно скрипт VBS. Это же скрипт VBS? Почему VBS? Я хотел превратить его в макрос (обернуть содержимое в Sub ... End Sub) и использовать в Excel

Iska 23-03-2020 22:30 2914417

Цитата:

Цитата v79italya
Как удалить все после первого двоеточия вместе с двоеточием? »

Попробуйте так:
Скрытый текст
Код:

Option Explicit

Dim strSourceFolder

Dim objFSO
Dim objFile
Dim strContent


If WScript.Arguments.Count = 1 Then
        strSourceFolder = WScript.Arguments.Item(0)
       
        Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
       
        If objFSO.FolderExists(strSourceFolder) Then
                For Each objFile In objFSO.GetFolder(strSourceFolder).Files
                        If StrComp(objFSO.GetExtensionName(objFile.Name), "txt", 0) = 0 Then
                                Dim objTS
                               
                                With objFSO.OpenTextFile(objFile.Path)
                                        strContent = .ReadAll()
                                        .Close
                                End With
                               
                                With WScript.CreateObject("VBScript.RegExp")
                                        .Pattern  = "^(\d+):.*$"
                                        .Global    = True
                                        .Multiline = True
                                       
                                        If .Test(strContent) Then
                                                strContent = .Replace(strContent, "$1")
                                               
                                                With objFSO.CreateTextFile(objFile.Path, True)
                                                        .Write Replace(Replace(strContent, vbCr, ""), vbLf, vbCrLf)
                                                        .Close
                                                End With
                                        End If
                                End With
                        Else
                                ' Nothing to do
                        End If
                Next
        Else
                WScript.Echo "Can't find source folder [" & strSourceFolder & "]."
                WScript.Quit 2
        End If
       
        Set objFSO = Nothing
Else
        WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ <Source folder>"
        WScript.Quit 1
End If

WScript.Quit 0


Путь к целевому каталогу задаётся параметром скрипта (также можно просто перетащить папку на скрипт в Проводнике). Из каталога выбираются все .txt-файлы.

Цитата:

Цитата v79italya
А можно путь к папке задать? »

Цитата:

Цитата Iska
Путь к целевому каталогу задаётся параметром скрипта (также можно просто перетащить папку на скрипт в Проводнике). »

Цитата:

Цитата v79italya
Еще я сразу написал что нужно скрипт VBS. Это же скрипт VBS? »

Это скрипт WSH, написанный на языке VBScript.

Цитата:

Цитата v79italya
Я хотел превратить его в макрос (обернуть содержимое в Sub ... End Sub) и использовать в Excel »

Просто «обернуть и использовать» не получится. VBScript WSH и VBA — близкие, но разные языки. Что мешало Вам зараз сказать про VBA и Excel?

v79italya 23-03-2020 22:36 2914419

Сохранил с расширением .vbs, закинул в папку с файлами CSV и запустил. Вышло окно с текстом : Usage: cscript.exe//nologo "vvbbss.vbs" <Source folder>

Цитата:

Цитата Iska
Путь к целевому каталогу задаётся параметром скрипта (также можно просто перетащить папку на скрипт в Проводнике) »

Как это делается?
Цитата:

Цитата Iska
Просто «обернуть и использовать» не получится. VBScript WSH и VBA — близкие, но разные языки. Что мешало Вам зараз сказать про VBA и Excel? »

Скрипт так скрипт. Буду отдельно от других макросов запускать.
Что мешало? Я думал любой скрипт можно обернуть в sub и превратить в макрос. Получается, ошибался

megaloman 23-03-2020 22:46 2914422

Цитата:

Цитата v79italya
Я хотел превратить его в макрос (обернуть содержимое в Sub ... End Sub) и использовать в Excel »

Каким образом? Загрузить csv на лист Excel?

Iska 23-03-2020 22:48 2914424

Цитата:

Цитата v79italya
Как это делается? »

Просто перетащите искомую папку из Проводника на скрипт. Ухватите её мышкой, перетащите на скрипт и отпустите.

v79italya 23-03-2020 22:54 2914426

Цитата:

Цитата megaloman
Каким образом? Загрузить csv на лист Excel? »

Вот этот макрос, сделанный из скрипта, работает не загружая в Excel. Вот, наподобие этого и хотел.
Этот макрос заменяет null на 0. Мне это не подходит.Хотел другим макросом предварительно удалить строки с null
HTML код:

Sub Content_for_etfs_conver()
'Kill "D:\IN\*.*"
Kill "D:\OUT\*.*"
  Dim fso
  Set fso = CreateObject("scripting.filesystemobject"):
' fso.CopyFolder "E:\downloads1", "D:\IN"
cPath = fso.GetParentFolderName(ThisWorkbook.FullName)
cPathIn = cPath & "\In\"
cPathOut = cPath & "\Out\"
Set Folder = fso.GetFolder(cPathIn)
For Each File In Folder.Files
  If fso.GetExtensionName(File.Name) = "csv" Then
      With fso.OpenTextFile(cPathIn & File.Name, 1, True)
        cIn = .ReadAll
        .Close
      End With
      cOut = vbCrLf & "DATE"
      'cOut = "DATE"
      arrL = Split(cIn, vbLf)
      For i = 1 To UBound(arrL)
        If Len(arrL(i)) > 0 Then
            arrD = Split(arrL(i), ",")
            arrD(0) = Format(CDate(arrD(0)), "dd.MM.yyyy")
           
            For j = 1 To 4
              arrD(j) = CStr(Round(Val(arrD(j)), 2))
            Next
            arrD(6) = CStr(Round(Val(arrD(6)), 0))
           
            cOut = cOut & vbCrLf & Join(Array(arrD(0), arrD(1), arrD(2), arrD(3), arrD(4), arrD(6)), vbTab)
        End If
      Next
      With fso.OpenTextFile(cPathOut & File.Name, 2, True)
        .Write cOut
        .Close
      End With
  End If
Next
 
 
MsgBox "Ok"
 
End Sub

Цитата:

Цитата Iska
Ухватите её мышкой, перетащите на скрипт и отпустите »

Понял я теперь :) :sorry: Получилось) Спасибо большое
Второй скрипт тоже отлично работает. Спасибо большое

megaloman 25-03-2020 18:03 2914679

Цитата:

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

Там, похоже, обрабатываются все файлы .csv в указанной папке.
Вот мой вариант vbs-скрипта чтобы удалить во всех файлах CSV в указанной папке строки, содержащие null
Код:

BoxIn0 = "Z:\Box_In"
BoxIn0 = ""

FileIn = "^.*\.csv$"
Repl = "\n.*,null.*"

BoxIn = ""
With WScript.Arguments
    If .Count > 0 Then
        BoxIn = Trim(.Item(0))
        If Right(BoxIn, 1) = "\" Then BoxIn = Mid(BoxIn, 1, Len(BoxIn) - 1)
    Else
        Set objShell = CreateObject("Shell.Application")
        Set objBoxIn = objShell.BrowseForFolder(0, "Выбирайте папку для обработки CSV-файлов", 1, BoxIn0)

        If objBoxIn Is Nothing Then
            MsgBox "Папка не выбрана, скрипт завершаем"
            WScript.Quit 2
        End If

        BoxIn = objBoxIn.Self.Path
    End If
End With

With CreateObject("Scripting.FileSystemObject")
    On Error Resume Next
        Set Folds = .GetFolder(BoxIn)
        If Err.Number <> 0 Then
            MsgBox "Ошибка при открытии папки" + vbCrLf + BoxIn + vbCrLf + vbCrLf + Err.Description
            WScript.Quit 2
        End If
    On Error GoTo 0
   
    Set RegMaska = CreateObject("VBScript.RegExp")
    RegMaska.Pattern = FileIn
    RegMaska.IgnoreCase = True
   
    Set RegRepl = CreateObject("VBScript.RegExp")
    RegRepl.Pattern = Repl
    RegRepl.IgnoreCase = True
    RegRepl.Global = True
   
    Set Files = Folds.Files
   
    For Each jf In Files
        If RegMaska.Test(jf) Then
'            MsgBox jf
            On Error Resume Next
            Err.Number = 0
            Set fIn = .OpenTextFile(jf, 1, False)
           
            If Err.Number <> 0 Then
                MsgBox "Ошибка при открытии файла" + vbCrLf + .GetAbsolutePathName(jf) + vbCrLf + vbCrLf + Err.Description
                On Error GoTo 0
'                WScript.Quit 2
            Else
                Alls = ""
                Alls = fIn.ReadAll
                fIn.Close
                On Error GoTo 0
                If RegRepl.Test(Alls) Then
                    jfNew = jf.Path
                    If .FileExists(jf + ".bak") Then .DeleteFile jf + ".bak", True
                    .MoveFile jf, jf + ".bak"      ' ==== Создание страх копии
                   
                    With .CreateTextFile(jfNew, True)
                        .Write (RegRepl.Replace(Alls, ""))
                        .Close
                    End With
                End If
            End If
        End If
    Next

End With

Можете просто перетащить обрабатываемую папку из Проводника на скрипт или на иконку, созданную для скрипта на рабочем столе. Ухватите её мышкой, перетащите на скрипт и отпустите.
Можете вызвать скрипт из командной строки, указав в аргументе скрипта в кавычках путь к папке.
Можете простр вызвать скрипт, откроется интерфейс для открытия нужной папки.
Я предусмотрел для изменяемых файлов создание страховой копии с расширением .bak

v79italya 26-03-2020 05:03 2914722

megaloman, спасибо большое

v79italya 26-03-2020 06:48 2914723

Цитата:

Цитата megaloman
вызвать скрипт из командной строки, указав в аргументе скрипта в кавычках путь к папке »

какой командой в cmd запустить скрипт, указав местонахождение скрипта и папки с CSV?
Путь к скрипту: D:\Новая папка\script.vbs
Путь к папке: D:\Новая папка\папка
Еще можно ли в скрипте прописать не сохранять bak-и? Или добавить строки, которые удалят эти bak-и из папки?

Iska, а ваш скрипт можно вызвать из cmd ?

megaloman 26-03-2020 08:13 2914728

Вложений: 1
vbs-скрипт - это исполнимый файл. Примеры запуска из командного окна в прикрепленном файле. Его вызов можно прописать в bat-файле, но смысла в этом никакого.
Код:

"D:\Новая папка\script.vbs" "D:\Новая папка\папка"
Bat сохранить в 866 кодировке.
Цитата:

Цитата v79italya
Еще можно ли в скрипте прописать не сохранять bak-и? »

В предыдущем посте я выделил в коде строку, создающую bak, красным. Если Вы её закомментируете (то есть поставите в начале строки апостроф ' , то bak создаваться не будет.
По моему скромному мнению также можно поступить и со скриптом Iska, тем более что при его неверном использовании его скрипт выдаёт инструкцию с форматом командной строки для его запуска.

v79italya 26-03-2020 08:45 2914731

megaloman, спасибо. Позже опробую

Iska 26-03-2020 09:53 2914739

Цитата:

Цитата v79italya
Iska, а ваш скрипт можно вызвать из cmd ? »

Можно:
Код:

"%SystemRoot%\System32\cscript.exe" //nologo "D:\Новая папка\script.vbs" "D:\Новая папка\папка"

v79italya 26-03-2020 13:46 2914757

Iska, megaloman, спасибо
Мне cmd нужно было для макроса. Но не смог настроить.
HTML код:

Sub aa()
'Shell "cmd.exe", vbNormalFocus
'Shell "cmd.exe /t:0f /k cd C:\MIDI"
'Shell ("c:\windows\system32\cmd.exe  ""D:\Новая папка\b.vbs"" ""D:\Новая папка\Новая папка") & vbCr
'Shell ("c:\windows\system32\cmd.exe" & Chr(34) & "\" & Chr(34) & "D:\Новая папка\b.vbs" & Chr(34) & " " & Chr(34) & "D:\Новая папка\Новая папка")
End Sub

Не разбираюсь совсем в этом, делал по нагугленному и методом проб. Ничего не получилось и уже устал. Хватит мне вариант: схватить и бросить на скрипт

megaloman 26-03-2020 13:51 2914760

v79italya, зачем нужен этот макрос? Почему Вы привязаны к Excel? В чем конечная цель? Или Вам надо эту задачу решить в CMD?
Кастрировал vbs и превратил его в макрос Excel. Путь к папке указать явно.
Код:

Sub AA()

BoxIn = "D:\Новая папка\папка"
FileIn = "^.*\.csv$"
Repl = "\n.*,null.*"

With CreateObject("Scripting.FileSystemObject")
    On Error Resume Next
        Set Folds = .GetFolder(BoxIn)
        If Err.Number <> 0 Then
            MsgBox "Ошибка при открытии папки" + vbCrLf + BoxIn + vbCrLf + vbCrLf + Err.Description
            Exit Sub
        End If
    On Error GoTo 0
   
    Set RegMaska = CreateObject("VBScript.RegExp")
    RegMaska.Pattern = FileIn
    RegMaska.IgnoreCase = True
   
    Set RegRepl = CreateObject("VBScript.RegExp")
    RegRepl.Pattern = Repl
    RegRepl.IgnoreCase = True
    RegRepl.Global = True
   
    Set Files = Folds.Files
   
    For Each jf In Files
        If RegMaska.Test(jf) Then
            On Error Resume Next
            Err.Number = 0
            Set fIn = .OpenTextFile(jf, 1, False)
           
            If Err.Number <> 0 Then
                MsgBox "Ошибка при открытии файла" + vbCrLf + .GetAbsolutePathName(jf) + vbCrLf + vbCrLf + Err.Description
                On Error GoTo 0
            Else
                Alls = ""
                Alls = fIn.ReadAll
                fIn.Close
                On Error GoTo 0
                If RegRepl.Test(Alls) Then
                    jfNew = jf.Path
                    If .FileExists(jf + ".bak") Then .DeleteFile jf + ".bak", True
'                    .MoveFile jf, jf + ".bak"      ' ==== Создание страх копии
                   
                    With .CreateTextFile(jfNew, True)
                        .Write (RegRepl.Replace(Alls, ""))
                        .Close
                    End With
                End If
            End If
        End If
    Next
End With
End Sub


v79italya 26-03-2020 14:59 2914764

Цитата:

Цитата megaloman
зачем нужен этот макрос? Почему Вы привязаны к Excel? »

У меня все на макросах построено. Перед скачиванием этих csv фильтрация нужных тикеров, после скачивания обработка этих csv - все на макросах и формулах. Причем я макросы не пишу, могу только пользоваться(могу интуитивно изменить). Собрал все воедино. а недельку назад программка скачивания перестала работать. Пришлось скачивать напрямую, в этот раз уже в csv(до этого в txt), еще и строки пустые остаются. вот и надо было исправить.
Цитата:

Цитата megaloman
В чем конечная цель? Или Вам надо эту задачу решить в CMD? »

В cmd не надо решать, просто у меня уже есть один скрипт, который запускаю макросом через cmd. И этот хотел запустить. Не получилось бы и ладно, вариант СХВАТИТЬ ПАПКУ И БРОСИТЬ НА СКРИПТ очень подходит.
А конечная цель: получить тикеры, отвечающие необходимым требованиям. В свободном доступе фильтрация по моим условиям не найдена, вот и сделал свое. Как то так.
Спасибо большое за помощь

Jeka124 06-09-2020 14:05 2933062

Всем привет. Столкнулся с такой проблемой. Есть пару тысяч txt файлов и в них нужно оставить определенные строки а остальное удалить, после этого файлы сохранить с таким же именем.

type your_file.txt | findstr /i /v "mozila" > temp.txt
del your_file.txt
rename temp.txt your_file.txt


Код расположенный выше не подходит так как нужно прописывать имя, и за один раз он обработает только один файл а нужно сразу все, иначе смысле этой затеи теряется так как макросом это все сделать будет гораздо быстрее. Операционная система Win 10. Если кто знаете подскажите.

Iska 06-09-2020 14:32 2933071

Цитата:

Цитата Jeka124
Есть пару тысяч txt файлов »

Это будет зависеть от того, где они «есть».

megaloman 06-09-2020 15:07 2933077

Цитата:

Цитата Jeka124
Есть пару тысяч txt файлов »

Если в одной папке, то
Код:

@Echo Off
        Set "BoxIn=Z:\Box_In"
        Set "Mask=*.txt"
        Set "KeyWord=mozila"

        Pushd "%BoxIn%" && FOR /F "usebackq delims=" %%f IN (`2^>nul Dir "%Mask%" /B /A:-D`) DO (
                >"%%f.tmp" (FOR /F "usebackq delims=" %%t IN (`2^>nul More "%%f"^|FindStr /I /V "%KeyWord%"`) DO Echo %%t)
                >nul Move /Y "%%f.tmp" "%%f"
        )
        Popd
Exit /B

Если в разных, без просмотра подпапок, то:
Код:

@Echo Off
        Set BoxIn="Z:\Box_In" "Z:\Soft_In"
        Set "Mask=*.txt"
        Set "KeyWord=mozila"

        For %%d In (%BoxIn%) Do (
                Pushd "%%~d" && FOR /F "usebackq delims=" %%f IN (`2^>nul Dir "%Mask%" /B /A:-D`) DO (
                        >"%%f.tmp" (FOR /F "usebackq delims=" %%t IN (`2^>nul More "%%f"^|FindStr /I /V "%KeyWord%"`) DO Echo %%t)
                        >nul Move /Y "%%f.tmp" "%%f"
                )
                Popd
        )
Exit /B


Jeka124 06-09-2020 16:39 2933086

Все файлы в одной папке. Что-то не работает. Первая строка это путь к папке с файлами? В третью строку я вписывают ключевой слово? Если в файле мне нужно оставить не одну строку а несколько, повторить третью строку с другим ключевым словом? Это через бат файл? Сорян возможно задаю тупые вопросы - новичок.

Текст в файлах на русском языке, возможно это имеет значение или должно срабатывать в любом случае?

Jeka124 06-09-2020 17:01 2933090

Вложений: 1
Ок,

megaloman 06-09-2020 17:13 2933092

Начнём сначала:
Цитата:

Цитата Jeka124
type your_file.txt | findstr /i /v "mozila" > temp.txt
del your_file.txt
rename temp.txt your_file.txt »

Цитата:

Цитата Jeka124
Если в файле мне нужно оставить не одну строку а несколько, повторить третью строку с другим ключевым словом? Это через бат файл? »

1.findstr /i /v "mozila" позволяет выдать все строки, которые не содержат , условно, слово mozila. Объясните, что Вы хотите: оставить все строки со словом, условно, mozila, либо удалить эти строки.
2. В какой кодировке сохранены текстовые файлы? Неплохо бы получить образец файла. Так как Вы хотите работать с кириллицей, кодировка важна.

Jeka124 06-09-2020 17:26 2933097

Вложений: 2
Суть в том, что нужно собрать некоторые данные о школах есть файлы с данными но там много лишнего и это нужно убрать. В файле столбцы это те строки которые должны остаться в конечном итоге, второй файл образец. Работаю через Notepad++ и там кодировку можно изменить, вот только не знаю во всех одновременно можно это сделать.

Iska 06-09-2020 17:45 2933100

Цитата:

Цитата Jeka124
Если в файле мне нужно оставить не одну строку а несколько, повторить третью строку с другим ключевым словом? »

Нет. Вам нужно было бы повторить параметр «/c» и, если именно «оставить» — то убрать параметр «/v»:
Код:

… findstr.exe /i /c:"мама" /c:"мыла" /c:"раму"
Цитата:

Цитата Jeka124
Текст в файлах на русском языке, возможно это имеет значение или должно срабатывать в любом случае? »

Имеет значение кодировка данных файлов. У Вас она — UTF8/65001 без BOM, посему быстрее, проще и надёжнее в данном случае будет пользовать PowerShell.

Jeka124 06-09-2020 18:04 2933103

А как это реализовать через PowerShell?

Fors1k 06-09-2020 18:05 2933104

Цитата:

Цитата Jeka124
А как это реализовать через PowerShell? »

Код:

param(
    $model  = "C:\Files\Столбцы.txt",
    $folder = "C:\Box_In"
)cls

foreach($i in (gci $folder *.txt).FullName){
    foreach($j in (gc $model -en UTF8)){
        gc $i -enc UTF8|? {$_ -like "$j*"}
    }
}


Jeka124 06-09-2020 18:27 2933106

Что-то не работает. Первая строка это путь к образу? Вторая путь к файлам? Если так то не работает, все файлы остались без изменений. Возможно я что-то не так делаю. В общем скопировал код создал файл вставил код, сохранил поменял расширение на ps1, открыл windows powerhell ise от имени админа нажал выполнить, какие-то действия были выполнены но вот результата нет, возможно результат не сохраняется?

megaloman 06-09-2020 18:46 2933109

Вложений: 1
Если в пути папки, заданном в батнике, нет кириллических символов, если сохранять батник в UTF8 без BOM, то можно выкрутиться. В приложенном батнике, переименованном в txt, удаляются строки с двумя (можно больше) фразами.
Код:

@Echo Off
        Set "BoxIn=Z:\Box_In"
        Set "Mask=*.txt"
        Set KeyWord="Ступень" "Бюджетирование (основатель)"

        Pushd "%BoxIn%" && FOR /F "usebackq delims=" %%f IN (`2^>nul Dir "%Mask%" /B /A:-D`) DO (
                FOR  %%k IN (%KeyWord%) DO (
                        >"%%f.tmp" (More "%%f"|Find /I /V %%k)
                        >nul Move /Y "%%f.tmp" "%%f"
                )
        )
        Popd
Exit /B

FindStr не работает с UTF и за раз исключить строки с несколькими словами не получается, поэтому применяется Find последовательно для каждой из исключаемых фраз.
Можно, наверное, сделать выборку строк с ключевыми фразами, но это несколько иная песТня.
Надеюсь, спецы по PowerShell напишут приемлемое для ваших тысяч файлов

Jeka124 06-09-2020 19:02 2933110

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

megaloman 06-09-2020 19:16 2933111

Вложений: 1
а удалялись все кроме этих
Сохранить в UTF8 без BOM, путь должен быть без кириллицы.
Код:

@Echo Off
        Set "BoxIn=Z:\Box_In"
        Set "Mask=*.txt"
        Set KeyWord="Ступень" "Бюджетирование (основатель)"

        Pushd "%BoxIn%" && FOR /F "usebackq delims=" %%f IN (`2^>nul Dir "%Mask%" /B /A:-D`) DO (
                >"%%f.tmp" (FOR  %%k IN (%KeyWord%) DO (More "%%f"|Find /I %%k))
                >nul Move /Y "%%f.tmp" "%%f"
        )
        Popd
Exit /B

Во первых, это не эффективно
Во вторых, в результате получим на выходе файлы, где строки будут следовать в порядке, указанном в Set KeyWord=..... вне зависимости от того, как они следовали в исходных файлах
Я сделал, что мог, кто может, пусть сделает по другому. Вперёд на штурм PowerShel :)

megaloman 06-09-2020 20:54 2933122

Вложений: 1
Jeka124, До меня не сразу дошло: у Вас есть бланк, надо преобразовать входные файлы в соответствии с бланком.
Вот вариант, но работать он будет медленно, сохранить в UTF
Код:

@Echo Off
        Set "BoxIn=Z:\Box_In"
        Set "Mask=*.txt"
        Call :KeyWord
        Pushd "%BoxIn%" && FOR /F "usebackq delims=" %%f IN (`2^>nul Dir "%Mask%" /B /A:-D`) DO (
                Echo %%f
                >"%%f.tmp" (FOR /F "usebackq delims==" %%k IN (`Set "@@"`) DO (More "%%f"|Call Find /I "%%%%k%%"))
                >nul Move /Y "%%f.tmp" "%%f"
        )
        Popd
Exit /B

:KeyWord
        Set "@@01=Код ЕГРПОУ:"
        Set "@@02=Полное название:"
        Set "@@03=Сокращенное название:"
        Set "@@04=Тип ЗОСО:"
        Set "@@05=Ступень:"
        Set "@@06=Форма собственности:"
        Set "@@07=Тип местности:"
        Set "@@08=Индекс:"
        Set "@@09=Почтовый адрес:"
        Set "@@10=Код КОАТУУ:"
        Set "@@11=Телефоны:"
        Set "@@12=E-mail:"
        Set "@@13=Директор:"
        Set "@@14=Куратор ЗОСО:"
        Set "@@15=Уполномоченное лицо:"
        Set "@@16=Количество учащихся:"
        Set "@@17=Количество персонала:"
        Set "@@18=Количество классов:"
        Set "@@19=Бюджетирование (основатель):"
Exit /B


DJ Mogarych 06-09-2020 20:56 2933123

Powershell:
Код:

dir "C:\temp\20200906\*.txt" -Recurse |% {
$data = gc "$($_.fullname)" -encoding utf8 |Select-String `
"Код ЕГРПОУ:",
"Полное название:",
"Сокращенное название:",
"Тип ЗОСО:",
"Ступень:",
"Форма собственности:",
"Тип местности:",
"Индекс:",
"Почтовый адрес:",
"Код КОАТУУ:",
"Телефоны:",
"E-mail:",
"Директор:",
"Куратор ЗОСО:",
"Уполномоченное лицо:",
"Количество учащихся:",
"Количество персонала:",
"Количество классов:",
"Бюджетирование (основатель):"

$data |Set-Content "$($_.fullname)" -Encoding utf8

}

Если в исходном файле нет той или иной строки, она должна быть в конечном файле?

Jeka124 06-09-2020 21:34 2933129

Да, как данным скриптом пользоваться? я запускаю а он что-то не работает

Fors1k 06-09-2020 21:39 2933131

Цитата:

Цитата Jeka124
возможно результат не сохраняется? »

Да, я тогда убегал, и выложил только поиск строк, без записи.
Вот с записью в тот же файл:
Код:

param(
    $model  = "C:\Files\Столбцы.txt",
    $folder = "C:\Box_In"
)cls

foreach($i in (gci $folder *.txt).FullName){
    $l=foreach($j in (gc $model -en UTF8)){
        gc $i -enc UTF8|? {$_ -like "$j*"}
    }$l|out-file $i
}


DJ Mogarych 06-09-2020 21:44 2933132

Цитата:

Цитата Jeka124
я запускаю а он что-то не работает »

ПКМ - "Запустить в Powershell"

Путь в файлам не забыли исправить?

Fors1k 06-09-2020 21:48 2933133

Цитата:

Цитата Jeka124
Да, как данным скриптом пользоваться? я запускаю а он что-то не работает »

Цитата:

Цитата Jeka124
открыл windows powerhell ise от имени админа »

,вставить код, изменить путь, нажать F5.

Jeka124 06-09-2020 21:50 2933134

Эта строка (dir "C:\temp\20200906\*.txt" -Recurse |% )путь к txt файлам?

Вот что выдает
Пути я поменял перенес на другой диск а то винда не дает доступ

G:\Box_In\1.ps1:27 знак:15
+ $model = "G:\Files\St.txt",
+ ~~~~~~~~~~~~~~~~~
Недопустимое условие назначения. Входным значением оператора назначения должен быть объект, способный принимать назначения, такой как переменная или свойство.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : InvalidLeftHandSide

Смайлик не ставил это форум преобразовал :№) без знака №

Fors1k 06-09-2020 21:54 2933137

Цитата:

Цитата Jeka124
G:\Box_In\1.ps1:27 знак:15
+ $model = "G:\Files\St.txt", »

$model... - это вторая строка, а не 27. Покажите весь код, который запускаете.

Jeka124 06-09-2020 22:01 2933138

dir "G:\Box_In*.txt" -Recurse |% {
$data = gc "$($_.fullname)" -encoding utf8 |Select-String `
"Код ЕГРПОУ:",
"Полное название:",
"Сокращенное название:",
"Тип ЗОСО:",
"Ступень:",
"Форма собственности:",
"Тип местности:",
"Индекс:",
"Почтовый адрес:",
"Код КОАТУУ:",
"Телефоны:",
"E-mail:",
"Директор:",
"Куратор ЗОСО:",
"Уполномоченное лицо:",
"Количество учащихся:",
"Количество персонала:",
"Количество классов:",
"Бюджетирование (основатель):"

$data |Set-Content "$($_.fullname)" -Encoding utf8

}
param(
$model = "G:\Files\St.txt",
$folder = "G:\Box_In"
)cls

foreach($i in (gci $folder *.txt).FullName){
$l=foreach($j in (gc $model -en UTF8)){
gc $i -enc UTF8|? {$_ -like "$j*"}
}$l|out-file $i
}

Fors1k 06-09-2020 22:06 2933140

Jeka124, Вы 2 разных кода записали в один скрипт???
Еще раз:
1.Запустите powershell ise
2.Скопируйте и вставьте туда этот код (в окошко, где слева идет нумерация строк):
Код:

param(
    $model  = "G:\Files\St.txt",
    $folder = "G:\Box_In"
)cls

foreach($i in (gci $folder *.txt).FullName){
    $(foreach($j in (gc $model -enc UTF8)){
        gc $i -enc UTF8|? {$_ -like "$j*"}
    })|out-file $i
}

3. Проверьте правильность пути
4. Запускайте

Uragan66 06-09-2020 22:07 2933141

Jeka124, а зачем вы слепили два разных кода в один скрипт ?

Вот ещё такой вариант можете попробовать:
Код:

$folder = 'G:\Box_In'
$blank = 'G:\Files\St.txt'

Get-ChildItem $folder -filter *.txt -Recurse | ForEach {
$str = Get-Content "$($_.fullname)" -Encoding utf8 `
 | Select-String (Get-Content $blank -Encoding utf8 | ForEach {$_})

$str | Set-Content "$($_.fullname)" -Encoding utf8

}

По сути тот же код, что и у ув. DJ Mogarych, но немного оптимизированный.
Вот только не пойму, почему пропускается последняя строка (Бюджетирование (основатель):) в обоих вариантах этого кода...

Fors1k 06-09-2020 22:09 2933142

Цитата:

Цитата Uragan66
По сути тот же код, что и у ув. DJ Mogarych »

И ваш код, и от DJ Mogarych не будет искать последнюю строку, так как скобки в регэкспе требуют экранирования.

Uragan66 06-09-2020 22:15 2933143

Fors1k, ясно... спасибо за подсказку, как-то упустил из виду!
ну нужно всего-то экранировать скобки в файле St.txt

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

Jeka124 06-09-2020 22:24 2933145

В смысле, скобки в строке Бюджетирование мешают? Вы правы оба кода работают но есть один небольшой нюанс должно быть 19 строк не зависимо есть эта строка в обрабатываемом файле или нет просто эти данные будут заполнены позже. А так все ок.

Fors1k 06-09-2020 23:53 2933151

Цитата:

Цитата Jeka124
должно быть 19 строк не зависимо есть эта строка в обрабатываемом файле или нет »

Код:

param(
    $model  = "G:\Files\St.txt",
    $folder = "G:\Box_In"
)cls

foreach($i in (gci $folder *.txt)){
    $data = gc $model -raw -en UTF8
    $text = gc $i.FullName -en UTF8
    foreach($j in (gc $model -en UTF8)){
        $text|?{$_  -like "$j*"}|%{
        $data=$data.replace($j,$_)} 
    }
    $data|out-file $i.FullName
}


Jeka124 07-09-2020 00:08 2933152

Благодарю, все работает отлично.

Jeka124 08-09-2020 12:11 2933318

Не пойму в чем проблема, скрипт удаляет Сокращенное название: я как-то не обратил изначально на это внимание так как не у всех файлах данные пункт был заполнен

megaloman 08-09-2020 13:12 2933325

Jeka124, Это Ваши проблемы:
в файле "Столбцы.txt" у Вас "Сокращенное название:"
в файле "11493.txt" "Сокращенное:"
Естественно по такой ключевой фразе поиск не состоится.

Вообще-то я бы изменил методику кодировки отчетов, например, первые 3 позиции отвёл бы для цифрового кода, например:
Код:

010 Код ЕГРПОУ:
020 Полное название:
030 Сокращенное название:
040 Тип ЗОСО:
050 Ступень:
060 Форма собственности:
070 Тип местности:
080 Индекс:
090 Почтовый адрес:
100 Код КОАТУУ:
110 Телефоны:
120 E-mail:
130 Директор:
140 Куратор ЗОСО:
150 Уполномоченное лицо:
160 Количество учащихся:
170 Количество персонала:
180 Количество классов:
190 Бюджетирование (основатель):

и все выборки делал бы по цифровому коду - меньше вероятность орфографических несовпадений

Jeka124 08-09-2020 13:28 2933329

Понял, мой косяк!


Время: 05:26.

Время: 05:26.
© OSzone.net 2001-