PDA

Показать полную графическую версию : [решено] вывести количество строк в тхт файлах


Alexander_88
18-09-2015, 13:24
Здравствуйте, подскажите пожалуйста как можно посчитать количество строк в тхт файлах?

Есть папка 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
18-09-2015, 13:40
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}

Alexander_88
18-09-2015, 14:31
Спасибо, все работает :)

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

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 ?

YuS_2
28-10-2021, 10:11
можно ли здесь сделать исключения, то есть чтобы какие-то файлы не обрабатывались? »
Можно. Для этого необходимо использовать условный блок, в котором указать в условии файлы, которые необходимо исключить.
Примерно так:
...| 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


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

megaloman
28-10-2021, 12:57
@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
28-10-2021, 15:29
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
29-10-2021, 01:37
спасибо всем за ответы.
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)

megaloman
29-10-2021, 14:51
подкаталоги скрипт обрабатывает? »Обрабатывает. Но тут сработал баг 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Здесь для примера я в одном батнике обработал две маски с выводом статистики по каждой. Работает как с маской файла, так и с точным именем.

Alexander_88
29-10-2021, 17:31
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" и т.д.

megaloman
29-10-2021, 20:17
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
30-10-2021, 19:44
megaloman, Спасибо, работает теперь исключение :)




© OSzone.net 2001-2012