Подсчет символов в строке с Windows CMD - PullRequest
0 голосов
/ 19 марта 2019

У меня есть куча CSV-файлов, где мне нужно посчитать разделитель на строку, чтобы убедиться, что было доставлено нужное количество атрибутов. Файлы выглядят так:

attribute1 ~ attribute2 ~ 0 ~~~ 1 ~ 1000 ~ Attribute8

attribute1 ~ attribute2 ~ 0 ~~~ 1 ~ 1000 ~ Attribute8

attribute1 ~ attribute2 ~ 0 ~~~ 1 ~ 2000 ~ Attribute8

Разделитель - ~ (тильда). У вас есть какие-нибудь предложения? Это должен быть исполняемый файл из Windows cmd .

set inputFile=%FILE%
set "searchChar=~"

for /f "delims=" %%a in (' findstr /n "^" %FILE% ') do
    for /f "delims=:" %%b in ("%%~a") do (
        set "line=%%a"
        for /f %%c in (' cmd /u /v /e /q /c"(echo(!line:*:=!)"^|find /c "%searchChar%" ') do
            echo Line %%b has %%c characters
    )
)

он просто печатает количество символов. Мне нужно условие if, если %% c <> 7

Ответы [ 2 ]

1 голос
/ 19 марта 2019

При условии, что разделитель также не встречается в строках в кавычках, следующий скрипт PowerShell
проверяет каждую строку в файле и использует Measure-Object для поддержания -Sum, -Average -Min, -Max и-Count of the delimiters.

> Get-Content .\test.csv| ForEach-Object{($_ -split  '~').Count}|Measure-Object -Sum -Average -Minimum -Maximum

Count    : 3
Average  : 8
Sum      : 24
Maximum  : 8
Minimum  : 8
Property :

Если Average, Max и Min равны, все строки имеют одинаковое количество столбцов.

Чтобы быть в теме, обернутый в пакетный файл:

:: Q:\Test\2019\03\19\SO_55231094.cmd
@Echo off&SetLocal EnableExtensions EnableDelayedExpansion
set "inputFile=.\test.csv"

:: clear var with prefix _
for /f "delims==" %%A in ('set _ 2^>nul') do set "%%A="

for /f "usebackq tokens=1,2 delims=: " %%A in (`
  powershell -nop -c "(Get-Content $ENV:inputFile)|ForEach-Object{($_ -split '~').Count}|Measure-Object -Sum -Average -Minimum -Maximum"
`) do if "%%B" neq "" Set "_%%A=%%B"

Set _

Пример вывода

> Q:\Test\2019\03\19\SO_55231094.cmd
_Average=8
_Count=3
_Maximum=8
_Minimum=8
_Sum=24
0 голосов
/ 19 марта 2019

Это достаточно просто с PowerShell.Код сравнивает длину исходной строки со строкой, в которой удалены символы TILDE.

Это можно запустить на любом современном поддерживаемом компьютере Windows из cmd.exe.Да, намного проще и чище, если он написан в виде скрипта PowerShell.

@ECHO OFF
SET "inputFile=.\countds.csv"
powershell -NoLogo -NoProfile -Command ^
    "Get-Content -Path '%inputFile%' |" ^
        "ForEach-Object {" ^
            "$ns = $_ -replace '~','';" ^
            "if (($_.Length - $ns.Length) -ne 7) {" ^
                "'Length is {0}' -f ($_.Length - $ns.Length)" ^
            "}" ^
        "}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...