在Windows中的文件中计数分隔符

时间:2014-09-19 14:38:52

标签: windows cmd

我有一堆包含数千条记录的文件。每个文件的结构都是一样的。

每条记录都在一个单独的行上,并且多个字段由分隔符' |'分隔。

每行应该有36个字段,但问题是其中一些行有<> 35个字段,即<> 35' |'字符。

有人可以在Windows中建议一种方法,我可以通过它来识别行。 (就像带有分隔符的记录<> 35应写入坏文件)。

3 个答案:

答案 0 :(得分:1)

@ECHO Off
SETLOCAL
:: Looking for exactly 36 fields - no empty fields
FOR /f "delims=" %%a IN (q25936461.txt) DO (
 SET good=Y
 FOR /f "tokens=1,30*delims=|" %%m IN ("%%a") DO (
  IF "%%o" equ "" (SET "good=") ELSE (
   FOR /f "tokens=1,6,7delims=|" %%p IN ("%%o") DO (
    IF "%%r" neq "" SET "good="
    IF "%%q" equ "" SET "good="
   )
  )
 )
 IF NOT DEFINED good ECHO(%%a
)
ECHO ========== method 1 done =============
:: Looking for exactly 36 fields - allow empty fields
FOR /f "delims=" %%a IN (q25936461.txt) DO (
 SET good=Y
 SET "line=%%a"
 SET /a count=0
 CALL :analyse
 IF NOT DEFINED good ECHO %%a
)
ECHO ========== method 2 done =============

GOTO :EOF
:analyse
SET "linem=%line:*|=%"
IF "%linem%" neq "%line%" SET /a count+=1&SET "line=%linem%"&GOTO analyse
IF %count% neq 35 SET "good="
GOTO :eof

这是两种方法。测试是你的问题......

答案 1 :(得分:0)

开启

cat|dog|26/7/14|$15.00
cat|dog|26/7/14|$15.00
cat|dog|26/7/14|$15.00
cat|dog|26/7/14|$15.00
cat|dog|26/7/14|$15.00
cat|26/7/14|$15.00
cat|dog|26/7/14|$15.00
cat|dog|26/7/14|$15.00

这个命令

findstr /r /i /n /v "^.*|.*|.*|.*$" "C:\Users\User\Desktop\test.txt"

显示

6:cat|26/7/14|$15.00

输入findstr /?了解更多信息。

答案 2 :(得分:0)

如果有效行上的列数<= 15,则可以单独使用FINDSTR完成。

例如,以下内容将显示所有不具有3列的行:

findstr /vx "[^|]*|[^|]*|[^|]*" test.txt

但FINDSTR无法处理超过15个字符的术语。有关详细信息,请参阅What are the undocumented features and limitations of the Windows FINDSTR command?。您的搜索需要35个这样的条款。

以下解决方案返回所有错误行,但忽略空行。它依赖于REPL.BAT - a hybrid JScript/batch utility在stdin上执行正则表达式搜索/替换并将结果写入stdout。 REPL.BAT是纯脚本,可​​以在任何现代Windows机器上运行,从XP开始。

该解决方案使用REPL.BAT从具有正好36列的行中删除所有字符,然后使用FINDSTR打印至少包含一个字符的剩余行。

<test.txt repl "^([^|]*\|){35}[^|]*$" ""|findstr .