Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - [решено] вывести количество строк в тхт файлах

Ответить
Настройки темы
Любой язык - [решено] вывести количество строк в тхт файлах

Ветеран


Сообщения: 558
Благодарности: 5

Профиль | Отправить PM | Цитировать


Здравствуйте, подскажите пожалуйста как можно посчитать количество строк в тхт файлах?

Есть папка CONTENT, в ней еще куча папок, в которых есть тхт файлы. Я задаю имена файлов, которые мне нужны. (*.txt - все тхт файлы, start.txt - все файлы, которые найдутся с этим названием). Поиск ведется по всем папках, которые входят в папку CONTENT. Далее скрипт выводит список всех файлов, которые он нашел, в виде пути к файлу (каждый путь с новой строки). После каждого пути рядом справа скрипт через дефис выводит количество строк для данного файла. А ниже (после списка всех файлов) скрипт должен вывести сумму всех строк списка.

Пример:
Я задал файл start.txt

Скрипт вывел:

Код: Выделить весь код
C:\OneDrive\work\CONTENT\test\start.txt - 12
C:\OneDrive\work\CONTENT\111\start.txt - 18
C:\OneDrive\work\CONTENT\kron\start.txt - 2
C:\OneDrive\work\CONTENT\trava\start.txt - 458
490

Отправлено: 13:24, 18-09-2015

 

Ветеран


Сообщения: 1259
Благодарности: 861

Профиль | Отправить PM | Цитировать


PowerShell v4+:
Код: Выделить весь код
Get-ChildItem $Path -Include *.txt -File -Recurse | Foreach {$sum=0} {$sum += ($i = [IO.File]::ReadAllLines($_.FullName).Count);"{0} - {1}" -f $_.FullName,$i} {$sum}
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:40, 18-09-2015 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 558
Благодарности: 5

Профиль | Отправить PM | Цитировать


Спасибо, все работает

Отправлено: 14:31, 18-09-2015 | #3


Ветеран


Сообщения: 558
Благодарности: 5

Профиль | Отправить PM | Цитировать


Здравствуйте. Подскажите, а можно ли здесь сделать исключения, то есть чтобы какие-то файлы не обрабатывались?

Код: Выделить весь код
Get-ChildItem "C:\work\CONTENT" $Path -Include fileslink.txt -File -Recurse | Foreach {$sum=0} {$sum += ($i = [IO.File]::ReadAllLines($_.FullName).Count);"{0} - {1}" -f $_.FullName,$i} {$sum}
вот такой код использую.. можно ли сделать исключение для нескольких файлов в папке CONTENT ?

Отправлено: 07:50, 28-10-2021 | #4


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1235
Благодарности: 518

Профиль | Отправить PM | Цитировать


Цитата Alexander_88:
можно ли здесь сделать исключения, то есть чтобы какие-то файлы не обрабатывались? »
Можно. Для этого необходимо использовать условный блок, в котором указать в условии файлы, которые необходимо исключить.
Примерно так:
Код: Выделить весь код
...| Foreach {$sum=0} {
    if ($_.name -notmatch <regexp>){
        $sum += ($i = [IO.File]::ReadAllLines($_.FullName).Count)
        "{0} - {1}" -f $_.FullName,$i
    }
} {$sum}
где <regexp> - регулярное выражение, определяющее наименование файлов, которые необходимо исключить

Либо в командлете Get-ChildItem, использовать параметр -exclude и в нем уже указать исключаемые файлы (могут использоваться маски).
Справка по командлету:
Код: Выделить весь код
man Get-ChildItem

===
Цитата Alexander_88:
вот такой код использую.. »
Не совсем понятна ваша конструкция:
Код: Выделить весь код
Get-ChildItem "C:\work\CONTENT" $Path ...
- Здесь надо указывать либо путь к каталогу, либо путь, который должен быть записан в переменной $Path, то бишь использовать надо что-то одно...

-------
scio me nihil scire. Ѫ


Последний раз редактировалось YuS_2, 28-10-2021 в 10:30. Причина: Дополнение

Это сообщение посчитали полезным следующие участники:

Отправлено: 10:11, 28-10-2021 | #5


Ветеран


Contributor


Сообщения: 2735
Благодарности: 1699

Профиль | Отправить PM | Цитировать


CMD
Код: Выделить весь код
@Echo Off
cls
rem                  Сумма    Папка                      Маска   Список исключений если есть
	Call :Count "NTotal" "C:\OneDrive\work\CONTENT" "*.bat" ""\Dir21\" "\Dir11\1.bat" "2001""
 
	Echo NTotal=%NTotal%
pause
Exit /B

:Count
	>~Exclude.tmp (For %%m In (%~4) Do Echo %%~m)

	For /F "usebackq delims=" %%f In (`Xcopy /L /S /EXCLUDE:~Exclude.tmp "%~2\%~3" "%Tmp%\" ^| findstr.exe /C:":"`) Do (
		Set /A NF=0
		For /F "usebackq tokens=1* delims=:" %%i In (`FindStr /R /N /C:".*" "%%f"`) Do Set /A NF=%%i
		Call Echo %%NF%% = %%f
		Call Set /A %~1+=%%NF%%
	)
	Del ~Exclude.tmp	
Exit /B

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

Это сообщение посчитали полезным следующие участники:

Отправлено: 12:57, 28-10-2021 | #6


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6705
Благодарности: 1576

Профиль | Отправить PM | Цитировать


Powershell:
Код: Выделить весь код
$report = dir "C:\OneDrive\work\CONTENT\*.txt" -exclude "*name*" -Recurse |% {
"$($_.fullname);$((gc $_).count)" |ConvertFrom-Csv -Delimiter ';' -Header Путь,Строк
}
$report
($report.Строк |measure -sum).sum

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)

Это сообщение посчитали полезным следующие участники:

Отправлено: 15:29, 28-10-2021 | #7


Ветеран


Сообщения: 558
Благодарности: 5

Профиль | Отправить PM | Цитировать


спасибо всем за ответы.
megaloman, подскажите, в подкаталоги скрипт обрабатывает?
Делаю к примеру
Код: Выделить весь код
Call :Count "NTotal" "C:\OneDrive\work\CONTENT" "fileslink.txt"
пишет что fileslink.txt не найден.. а если так:
Код: Выделить весь код
Call :Count "NTotal" "C:\OneDrive\work\CONTENT\folder1" "fileslink.txt"
тогда нормально.. (файл fileslink.txt находится в папке folder1)

Отправлено: 01:37, 29-10-2021 | #8


Ветеран


Contributor


Сообщения: 2735
Благодарности: 1699

Профиль | Отправить PM | Цитировать


Цитата Alexander_88:
подкаталоги скрипт обрабатывает? »
Обрабатывает. Но тут сработал баг Xcopy.
У Вас есть, например, "C:\OneDrive\work\CONTENT" и там нет файла "fileslink.txt".
XCopy при этом не хочет искать этот файл в подпапках.
Если бы файл там был - прекрасно ищет.
Ситуация еще интереснее: если в маске файла есть подстановочный знак, например: "fileslink*.txt", то всё прекрасно ищется.
Учел этот баг, вот рабочая версия
Код: Выделить весь код
@Echo Off
cls
rem                  Сумма    Папка                      Маска   Список исключений если есть
	Call :Count "NTotal1" "C:\OneDrive\work\CONTENT" "*.vbs" ""\Dir21\" "\Dir11\""
	Echo +++ NTotal(*.vbs)=%NTotal1% &Echo.

	Call :Count "NTotal2" "C:\OneDrive\work\CONTENT" "Я21090916.bat" ""\Dir21\" "\Dir11\1.bat" "2001""
	Echo +++ NTotal(Я21090916.bat)=%NTotal2% &Echo.

	Set /A NTotal=%NTotal1%+%NTotal2%
	Echo === NTotal=%NTotal%
pause
Exit /B

:Count
	Set /A %~1=0
	>~Exclude.tmp (For %%m In (%~4) Do Echo %%~m)

	Set Comm="Xcopy /L /E /EXCLUDE:~Exclude.tmp "%~2\%~3?" "%Tmp%\" | findstr.exe /I /R /C:"^%~3$""
	Echo %3 |>nul 2>&1 FindStr /C:"*" /C:"?" &&Set Comm="Xcopy /L /E /EXCLUDE:~Exclude.tmp "%~2\%~3" "%Tmp%\" | findstr.exe /I /C:":""

	For /F "usebackq delims=" %%f In (`%Comm%`) Do (
		Set /A NF=0
		For /F "usebackq tokens=1* delims=:" %%i In (`FindStr /R /N /C:".*" "%%f"`) Do Set /A NF=%%i
		Call Echo %%NF%% = %%f
		Call Set /A %~1+=%%NF%%
	)
	Del ~Exclude.tmp	
Exit /B
Здесь для примера я в одном батнике обработал две маски с выводом статистики по каждой. Работает как с маской файла, так и с точным именем.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 29-10-2021 в 15:11.

Это сообщение посчитали полезным следующие участники:

Отправлено: 14:51, 29-10-2021 | #9


Ветеран


Сообщения: 558
Благодарности: 5

Профиль | Отправить PM | Цитировать


megaloman, спасибо, теперь все ищет... а если в списке исключений есть файл в таким же именем в определенной папке, его можно исключить? (либо всю папку).

Пробовал так:
Код: Выделить весь код
Call :Count "NTotal1" "C:\OneDrive\work\CONTENT" "fileslink.txt" "01 stop start"
и так:
Код: Выделить весь код
Call :Count "NTotal1" "C:\OneDrive\work\CONTENT" "fileslink.txt" "C:\work\CONTENT\01 stop start\fileslink.txt"
в обоих случаях скрипт исключает все папки, которые начинаются с 01.. т.е. не только "01 stop start", а еще и "01 folder1" "01 folder2" и т.д.

Отправлено: 17:31, 29-10-2021 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - [решено] вывести количество строк в тхт файлах

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Любой язык - [решено] Скопировать содержимое одного тхт файла столько раз, сколько строк в другом Alexander_88 Скриптовые языки администрирования Windows 4 11-06-2015 11:10
VBS/WSH/JS - помогите написать на javascript код для поиска и фильтрации в тхт файле строк. spiritmen Скриптовые языки администрирования Windows 0 06-02-2015 23:42
VBS/WSH/JS - Количество примечаний в Word-файлах Fresh96 Скриптовые языки администрирования Windows 9 20-03-2014 19:26
VBS/WSH/JS - Удаление строк в INI файлах gen0m.rsw Скриптовые языки администрирования Windows 5 27-06-2013 15:03
Сортировщик строк в текстовых файлах. borison Программное обеспечение Windows 2 04-02-2007 10:22




 
Переход