Войти

Показать полную графическую версию : [решено] Удаление строк в текстовом файле, как это сделать???


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

Iska
23-03-2020, 21:18
в файлах CSV »
…образцы нескольких из которых Вы упаковали в архив, каковой и приложили к сообщению?

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

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

v79italya
23-03-2020, 21:31
Или строго: первая часть — дата, и все остальные части — все null? »Лучше строго. Удалить строки, в которых идет сначала дата, а потом null-и

Iska
23-03-2020, 22:10
каким 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
Iska, спасибо за скрипт. А можно путь к папке задать?
Еще я сразу написал что нужно скрипт VBS. Это же скрипт VBS? Почему VBS? Я хотел превратить его в макрос (обернуть содержимое в Sub ... End Sub) и использовать в Excel

Iska
23-03-2020, 22:30
Как удалить все после первого двоеточия вместе с двоеточием? »
Попробуйте так:
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-файлы.

А можно путь к папке задать? »
Путь к целевому каталогу задаётся параметром скрипта (также можно просто перетащить папку на скрипт в Проводнике). »
Еще я сразу написал что нужно скрипт VBS. Это же скрипт VBS? »
Это скрипт WSH, написанный на языке VBScript.

Я хотел превратить его в макрос (обернуть содержимое в Sub ... End Sub) и использовать в Excel »
Просто «обернуть и использовать» не получится. VBScript WSH и VBA — близкие, но разные языки. Что мешало Вам зараз сказать про VBA и Excel?

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

Путь к целевому каталогу задаётся параметром скрипта (также можно просто перетащить папку на скрипт в Проводнике) »
Как это делается?Просто «обернуть и использовать» не получится. VBScript WSH и VBA — близкие, но разные языки. Что мешало Вам зараз сказать про VBA и Excel? »
Скрипт так скрипт. Буду отдельно от других макросов запускать.
Что мешало? Я думал любой скрипт можно обернуть в sub и превратить в макрос. Получается, ошибался

megaloman
23-03-2020, 22:46
Я хотел превратить его в макрос (обернуть содержимое в Sub ... End Sub) и использовать в Excel » Каким образом? Загрузить csv на лист Excel?

Iska
23-03-2020, 22:48
Как это делается? »
Просто перетащите искомую папку из Проводника на скрипт. Ухватите её мышкой, перетащите на скрипт и отпустите.

v79italya
23-03-2020, 22:54
Каким образом? Загрузить csv на лист Excel? »
Вот этот макрос, сделанный из скрипта, работает не загружая в Excel. Вот, наподобие этого и хотел.
Этот макрос заменяет null на 0. Мне это не подходит.Хотел другим макросом предварительно удалить строки с nullSub 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


Ухватите её мышкой, перетащите на скрипт и отпустите »
Понял я теперь :) :sorry: Получилось) Спасибо большое
Второй скрипт тоже отлично работает. Спасибо большое

megaloman
25-03-2020, 18:03
Вот этот макрос, сделанный из скрипта, работает не загружая в Excel. Вот, наподобие этого и хотел. » Там, похоже, обрабатываются все файлы .csv в указанной папке. 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
megaloman, спасибо большое

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

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

megaloman
26-03-2020, 08:13
vbs-скрипт - это исполнимый файл. Примеры запуска из командного окна в прикрепленном файле. Его вызов можно прописать в bat-файле, но смысла в этом никакого."D:\Новая папка\script.vbs" "D:\Новая папка\папка"Bat сохранить в 866 кодировке.Еще можно ли в скрипте прописать не сохранять bak-и? » В предыдущем посте я выделил в коде строку, создающую bak, красным. Если Вы её закомментируете (то есть поставите в начале строки апостроф ' , то bak создаваться не будет.
По моему скромному мнению также можно поступить и со скриптом Iska, тем более что при его неверном использовании его скрипт выдаёт инструкцию с форматом командной строки для его запуска.

v79italya
26-03-2020, 08:45
megaloman, спасибо. Позже опробую

Iska
26-03-2020, 09:53
Iska, а ваш скрипт можно вызвать из cmd ? »
Можно:
"%SystemRoot%\System32\cscript.exe" //nologo "D:\Новая папка\script.vbs" "D:\Новая папка\папка"

v79italya
26-03-2020, 13:46
Iska, megaloman, спасибо
Мне cmd нужно было для макроса. Но не смог настроить. 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
v79italya, зачем нужен этот макрос? Почему Вы привязаны к Excel? В чем конечная цель? Или Вам надо эту задачу решить в CMD? 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
зачем нужен этот макрос? Почему Вы привязаны к Excel? »У меня все на макросах построено. Перед скачиванием этих csv фильтрация нужных тикеров, после скачивания обработка этих csv - все на макросах и формулах. Причем я макросы не пишу, могу только пользоваться(могу интуитивно изменить). Собрал все воедино. а недельку назад программка скачивания перестала работать. Пришлось скачивать напрямую, в этот раз уже в csv(до этого в txt), еще и строки пустые остаются. вот и надо было исправить.В чем конечная цель? Или Вам надо эту задачу решить в CMD? »В cmd не надо решать, просто у меня уже есть один скрипт, который запускаю макросом через cmd. И этот хотел запустить. Не получилось бы и ладно, вариант СХВАТИТЬ ПАПКУ И БРОСИТЬ НА СКРИПТ очень подходит.
А конечная цель: получить тикеры, отвечающие необходимым требованиям. В свободном доступе фильтрация по моим условиям не найдена, вот и сделал свое. Как то так.
Спасибо большое за помощь

Jeka124
06-09-2020, 14:05
Всем привет. Столкнулся с такой проблемой. Есть пару тысяч 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
Есть пару тысяч txt файлов »
Это будет зависеть от того, где они «есть».




© OSzone.net 2001-2012