我有一堆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子句答案 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)