Войти

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


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

megaloman
06-09-2020, 15:07
Есть пару тысяч 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
Все файлы в одной папке. Что-то не работает. Первая строка это путь к папке с файлами? В третью строку я вписывают ключевой слово? Если в файле мне нужно оставить не одну строку а несколько, повторить третью строку с другим ключевым словом? Это через бат файл? Сорян возможно задаю тупые вопросы - новичок.

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

Jeka124
06-09-2020, 17:01
Ок,

megaloman
06-09-2020, 17:13
Начнём сначала:type your_file.txt | findstr /i /v "mozila" > temp.txt
del your_file.txt
rename temp.txt your_file.txt »
Если в файле мне нужно оставить не одну строку а несколько, повторить третью строку с другим ключевым словом? Это через бат файл? »1.findstr /i /v "mozila" позволяет выдать все строки, которые не содержат , условно, слово mozila. Объясните, что Вы хотите: оставить все строки со словом, условно, mozila, либо удалить эти строки.
2. В какой кодировке сохранены текстовые файлы? Неплохо бы получить образец файла. Так как Вы хотите работать с кириллицей, кодировка важна.

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

Iska
06-09-2020, 17:45
Если в файле мне нужно оставить не одну строку а несколько, повторить третью строку с другим ключевым словом? »
Нет. Вам нужно было бы повторить параметр «/c» и, если именно «оставить» — то убрать параметр «/v»:
… findstr.exe /i /c:"мама" /c:"мыла" /c:"раму" …

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

Jeka124
06-09-2020, 18:04
А как это реализовать через PowerShell?

Fors1k
06-09-2020, 18:05
А как это реализовать через 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
Что-то не работает. Первая строка это путь к образу? Вторая путь к файлам? Если так то не работает, все файлы остались без изменений. Возможно я что-то не так делаю. В общем скопировал код создал файл вставил код, сохранил поменял расширение на ps1, открыл windows powerhell ise от имени админа нажал выполнить, какие-то действия были выполнены но вот результата нет, возможно результат не сохраняется?

megaloman
06-09-2020, 18:46
@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 /BFindStr не работает с UTF и за раз исключить строки с несколькими словами не получается, поэтому применяется Find последовательно для каждой из исключаемых фраз.
Можно, наверное, сделать выборку строк с ключевыми фразами, но это несколько иная песТня.
Надеюсь, спецы по PowerShell напишут приемлемое для ваших тысяч файлов

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

megaloman
06-09-2020, 19:16
Сохранить в 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
Jeka124, До меня не сразу дошло: у Вас есть бланк, надо преобразовать входные файлы в соответствии с бланком. @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
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
Да, как данным скриптом пользоваться? я запускаю а он что-то не работает

Fors1k
06-09-2020, 21:39
возможно результат не сохраняется? »
Да, я тогда убегал, и выложил только поиск строк, без записи.
Вот с записью в тот же файл:
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
я запускаю а он что-то не работает »
ПКМ - "Запустить в Powershell"

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

Fors1k
06-09-2020, 21:48
Да, как данным скриптом пользоваться? я запускаю а он что-то не работает »
открыл windows powerhell ise от имени админа »
,вставить код, изменить путь, нажать F5.

Jeka124
06-09-2020, 21:50
Эта строка (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
G:\Box_In\1.ps1:27 знак:15
+ $model = "G:\Files\St.txt", »
$model... - это вторая строка, а не 27. Покажите весь код, который запускаете.




© OSzone.net 2001-2012