С Новым годом! Форум программистов, компьютерный форум, киберфорум
PowerShell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.66/35: Рейтинг темы: голосов - 35, средняя оценка - 4.66
M1ct1an

Удалить в файле пустые строки, если их больше чем N штук подряд

19.08.2014, 18:13. Показов 7273. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
прошу помощи!
нужно в powershell удалить пустые строки в файле txt если их больше чем n штук подряд.
Спасибо
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.08.2014, 18:13
Ответы с готовыми решениями:

Удалить в текстовом файле все пустые строки
Задан текстовый файл, удалить в нем все пустые строки. Выдать сообщение, что строки удалены или таковых строк не имеется.

Убрать пробелы из строки, если их больше одного подряд
Задание звучит так: В заданной строке с нулевым завершителем убрать пробелы, если их больше одного подряд. Определить количество символов...

Расчёт формулы 3 буквы 3 символа длина строки, сколько вариантов если больше 2 подряд не повторяются
Вот есть 3 символа abc (можно в виде цифр 123 так считать удобней) В строке может быть 3 символа, и варианты не повторяются. Таким...

7
49 / 49 / 8
Регистрация: 17.07.2011
Сообщений: 380
21.08.2014, 20:52
Цитата Сообщение от M1ct1an Посмотреть сообщение
нужно в powershell удалить пустые строки в файле txt если их больше чем n штук подряд
У меня вот так получилось. Возможно не изящно, поскольку еще плохо знаю PoSh, но вроде работает.
Здесь берется ИСХОДНЫЙ файл forPowerShell.txt , а результат записывается в выходной файл forPowerShellResult.txt. Оба они находятся в корне диска С:\
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#Получаем содержимое нашего исходного файла
$strings= Get-Content c:\forPowerShell.txt
 
#Считаем допустимое количество пустых строк
$dopustimoeKolvoPustuxStrok = read-host "Please enter N:"
 
#Переменная в которой будет содержаться количество пустых строк, которые идут подряд
$nullStringCounter=0
 
#Переменная, в которой будет содержаться адрес НАЧАЛА того, что мы будем считывать в РЕЗУЛЬТИРУЮЩИЙ файл
$start=0
 
#Переменная, в которой будет содержаться адрес КОНЦА того, что мы будем считывать в РЕЗУЛЬТИРУЮЩИЙ файл
$finish=0
 
 
#перебираем каждую строку
for($i=0; $i -lt $strings.length; $i++){
 
     #если строка равна пустой
     if ($strings[$i] -eq ""){
     $nullStringCounter++
     continue
     }
    
    #если строка не равна пустой
    if ($strings[$i] -ne ""){
   
        #если количество пустых строк превысило допустимое
        if($nullStringCounter -gt $dopustimoeKolvoPustuxStrok) {
    
        $finish=$i-$nullStringCounter-1
       
            #перебираем каждую строку начиная со start и по finish и записываем в новый файл
            for($j=$start; $j -le $finish; $j++){
            Add-Content -path c:\forPowerShellResult.txt -value ($strings[$j])
            }
            
            #раз начались не пустые строки , то start=$i
            if ($strings[$i-1] -eq ""){
            $start=$i
            }   
         
        }
        
    #сбросить счетчик пустых строк
    $nullStringCounter=0      
    }
 
#finish=$i   
$finish=$i 
}
 
#Запишем концовку файла
for($j=$start; $j -le $finish; $j++){
Add-Content -path c:\forPowerShellResult.txt -value ($strings[$j])
}
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33371 / 21497 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
22.08.2014, 13:31
Лучший ответ Сообщение было отмечено volvo как решение

Решение



Зачем это все? Регулярки ж никто не отменял:

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#Получаем содержимое исходного файла
$content = [System.IO.File]::ReadAllText("D:\test\test.txt")
 
#Считаем допустимое количество пустых строк
$nValue = read-host "Please enter N"
 
#Составляем регулярное выражение для поиска соответствующего количества пустых строк
$re = "(?m)(^\s*\r?\n){" + $nValue + ",}"
 
#Заменяем найденное пустой строкой (удаляем из строки, фактически)
$res = $content -replace $re, ""
 
#И выводим в результирующий файл
[System.IO.File]::WriteAllText("D:\test\test_out.txt", $res)
1
49 / 49 / 8
Регистрация: 17.07.2011
Сообщений: 380
25.08.2014, 22:41
А подскажите , пожалуйста, что нужно поюзать чтобы понять вот эти строки:
PowerShell
[System.IO.File]::ReadAllText
0
Модератор
Эксперт JS
 Аватар для Eva Rosalene
5241 / 2115 / 416
Регистрация: 06.01.2013
Сообщений: 4,846
25.08.2014, 23:11
CJS, .NET.Весь пауэршелл на нём завязан
1
29.10.2014, 16:43

Не по теме:

powershell перлообразен и достаточно лаконичeн,
но на Perl5 задача решается например след. однострочником и не зависит от размера файла с данными:

Bash
1
perl -i.saved -p -e  "$n=3;  undef $_ if ++$empty > $n and (/^$/ or undef $empty)"  d:\test\test.txt
где в $n число неудаляемых пустых строк,
файл test.txt перезапишется, а его оригинальная версия сохранится под именем test.txt.saved



0
403 / 86 / 8
Регистрация: 16.02.2013
Сообщений: 356
30.10.2014, 10:13
volodin661 ,
1. Предоставленный Вами скрипт на перл не только не работает, но вдобавок портит исходный файл. Проверено на ActivePerl 5.18.2.1802

2. Если Вам нравится что бы все было в одну строку, то пример от UI легко трансформируется

PowerShell
1
[System.IO.File]::WriteAllText("D:\a_out.txt", ($([System.IO.File]::ReadAllText("D:\a.txt")) -replace "(?m)(^\s*\r?\n){2,}", ""))
0
 Аватар для volodin661
6671 / 2264 / 346
Регистрация: 10.12.2013
Сообщений: 7,829
30.10.2014, 17:24
Цитата Сообщение от Cat2 Посмотреть сообщение
1. Предоставленный Вами скрипт на перл не только не работает, но вдобавок портит исходный файл. Проверено на ActivePerl 5.18.2.1802
когда писал, Windows под рукой не было, только юникс, поэтому проверить не мог, просто заменил одинарные кавычки в ключе -e на виндусовые двойные.
Вот сейчас проверил на ActivePerl 5.16, все корректно работает.


Цитата Сообщение от Cat2 Посмотреть сообщение
2. Если Вам нравится что бы все было в одну строку, то пример от UI легко трансформируется
мне в одну строку нравится, если в этой строке будет не более 40-50 символов,
а если будет больше, то не понравится ни мне, ни кому-то ещё.

теперь что касается твоего примера, регулярное выражение составлено неверно,
оно просто с'ест все пустые строки.

а правильно как-нить вот так (через look behind) :

Perl
1
-replace "(?m)(?<=(\s*\r*\n){2,})(\s*\r*\n)", ""
Добавлено через 8 минут
ну и последнее:

я проверил на гигабайтном файле, powershell, ясен перец, отваливается по памяти,
мой пример, перец не менее ясен, работает, потому как весь файл в память не засасывает.

справедливости ради стоит отметить, что на 100mb файле powershell отработал вполне шустро.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.10.2014, 17:24
Помогаю со студенческими работами здесь

В заданной матрице удалить строку, если положительных элементов в ней, больше чем отрицательных
Если в строке положительных чисел, больше чем отрицательных, то эту строку удалить. Помогите.

Если в строке количество пробелов больше, чем букв «а», то удалить каждый второй встречающийся пробел
Создать функцию программиста, которая подсчитывает в заданной строке количество заданных символов (вид символа вводится как параметр...

Если в строке количество пробелов больше, чем букв «а», то удалить каждый второй встречающийся пробел
Создать функцию программиста, которая подсчитывает в заданной строке количество заданных символов (вид символа вводится как параметр...

Удалить строки матрицы, в которых четных элементов больше, чем нечетных
Дана квадратная матрица A(nхn). Удалить строки матрицы, в которых четных элементов больше, чем нечетных.

Удалить те строки матрицы, в которых латинских букв больше, чем русских
В массив вводятся строки, содержащие русские и латинские буквы, цифры и другие символы. Удалить те строки, в которых латинских букв больше,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru