使用Windows CMD计算每行字符

时间:2019-03-18 22:37:57

标签: csv batch-file scripting

我有一堆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
    )
)

它仅打印字符数。如果%% c <> 7

,我需要一个if子句

2 个答案:

答案 0 :(得分:1)

在以下PowerShell脚本中,用引号引起来的字符串中也没有出现定界符
检查文件中的行,并使用Measure-Object来维护定界符的-Sum,-Average -Min,-Max和-Count。

> 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 :

如果平均值,最大值和最小值相等,则所有行的列数都相同。

要成为话题,将其包装在批处理文件中:

:: 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

答案 1 :(得分:0)

这对于PowerShell很简单。该代码将原始行的长度与删除了TILDE字符的行进行比较。

它可以在cmd.exe上任何受支持的现代Windows计算机上运行。是的,如果将其编写为PowerShell脚本,则将更加容易和清洁。

const_or_not char *foo(const char *s)