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

Аватара пользователя
Alexander_88

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

Сообщение Alexander_88 »

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



Есть папка 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
Аватара пользователя
Kazun

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

Сообщение Kazun »

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}
Аватара пользователя
megaloman

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

Сообщение megaloman »

Alexander_88, Была проблема с исключениями папок с пробелами в именах. Исправил, пробуйте.

Код:

Код: Выделить всё

@Echo Off
cls
rem                  Сумма    Папка                      Маска          Список исключений если есть
	Call :Count "NTotal" "C:\OneDrive\work\CONTENT" "fileslink.txt"
	Echo === NTotal=%NTotal%
	Call :Count "NTotal" "C:\OneDrive\work\CONTENT" "fileslink.txt" "\01 stop start\" "\01 folder1\fileslink.txt"  
	Echo === NTotal=%NTotal%
pause
Exit /B
:Count
	2>nul Del ~Exclude.tmp
	:Begin
		>>~Exclude.tmp Echo %~4
		Shift /4
		If Not "%~4"=="" GoTo :Begin
	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:":""
	Set /A %~1=0
	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

Чтобы исключить целиком папку, укажите например "\01 stop start\"

Чтобы исключить конкретный файл, то так: "\01 folder1\fileslink.txt"

Папок, файлов может быть несколько. В кавычках через пробелы.
Аватара пользователя
Alexander_88

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

Сообщение Alexander_88 »

Цитата Alexander_88:



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




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

Примерно так:



Код:

Код: Выделить всё

...| Foreach {$sum=0} {
    if ($_.name -notmatch ){
        $sum += ($i = [IO.File]::ReadAllLines($_.FullName).Count)
        "{0} - {1}" -f $_.FullName,$i
    }
} {$sum}

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



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

Справка по командлету:



Код:

Код: Выделить всё

man Get-ChildItem



===


Цитата Alexander_88:



вот такой код использую..
Любой язык - [решено] вывести количество строк в тхт файлах




Не совсем понятна ваша конструкция:



Код:

Код: Выделить всё

Get-ChildItem "C:\work\CONTENT" $Path ...

- Здесь надо указывать либо путь к каталогу, либо путь, который должен быть записан в переменной $Path, то бишь использовать надо что-то одно...
Аватара пользователя
YuS_2

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

Сообщение YuS_2 »

CMD

[spoiler]Код:
[/spoiler]

Код: Выделить всё

@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
Аватара пользователя
megaloman

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

Сообщение megaloman »

CMD

[spoiler]Код:
[/spoiler]

Код: Выделить всё

@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
Аватара пользователя
DJ Mogarych

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

Сообщение DJ Mogarych »

Powershell:



Код:

Код: Выделить всё

$report = dir "C:\OneDrive\work\CONTENT\*.txt" -exclude "*name*" -Recurse |% {
"$($_.fullname);$((gc $_).count)" |ConvertFrom-Csv -Delimiter ';' -Header Путь,Строк
}
$report
($report.Строк |measure -sum).sum
Аватара пользователя
Alexander_88

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

Сообщение Alexander_88 »

Цитата 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

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

Сообщение megaloman »

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" и т.д.
Ответить

Вернуться в «Скриптовые языки администрирования Windows»