我有unicode类型的文件,我需要检查文件,如果^
被用作分隔符或不使用批处理脚本
以下是文件内容的示例:
Case Id^Subcase Id^Cr Date Cust^Case Title^Contact First Name^Contact Last Name^Customer Phone Number^Contact E Mail
我尝试使用的方法是获取文件的第一行,存储到变量,然后对^
字符的字符串执行findstr,它似乎在这里不起作用。
以下是我尝试过的代码段:
set /p var1= < C:\corvallis\diversionpl.csv
echo %var1% |findstr /lic:"^" >nul && set "isFormat=FOUND" || set "isFormat=NOT FOUND"
echo %isFormat%
上述方法有没有尝试过的选项?
答案 0 :(得分:1)
你可以尝试
@echo off
setlocal enableextensions disabledelayedexpansion
set "carets="
for /f %%a in (
'findstr /n /r /c:"^" data.txt ^| findstr /b /c:"1:" ^| find /c "^"'
) do set "carets=%%a"
echo %carets%
if "%carets%"=="7" ( echo FOUND ) else ( echo NOT FOUND )
它是如何工作的?第一个findstr
只读取所有文件,对行进行编号。第二个findstr
过滤数据以仅检索第一行。在此之前,沿管道流动的所有数据都是unicode。现在,find /c
用于将此数据转换为ansi,将字符之间的空值转换为换行符,并计算包含^
的行数,即第一个中的分隔符数(如果找到)线
但这只会在假设文件是unicode的情况下起作用。
为什么for
或set /p
方法不起作用?如果文件是unicode(是的,放宽使用该术语),则每个字符有两个字节,&#34;正常&#34;一个和一个0x00(null)char。在批处理文件中,变量不能保留空值。您可以尝试读取该行,但该变量不会保留已读取的数据。
已编辑,以更简洁的方式在unicode或ansi文件中执行此操作(此时只测试第一行中^
的存在)
(type data.txt 2>nul|(set /p "data="&(set data|find "^">nul)))&& echo found || echo not found
或
(type data.txt 2>nul|(set /p "data="&(set data|find "^">nul)))
if errorlevel 1 (
echo not found
) else (
echo found
)
是的,它使用set /p
,因为type
命令将&#34;转换&#34;来自unicode的文件。
答案 1 :(得分:0)
for循环可以处理文件的内容并对其进行大量操作......我不确定这个算法是否可以工作但它至少应该让你到达某个地方......
@echo off
For /f "tokens=*" %%a in (filename.extension) do (
Echo "%%a" ¦ find "^^"
)
Pause
答案 2 :(得分:0)
试试这个..
@echo off
Set string=<%~1
Echo %string% ¦ find "^^"
Pause
将文件拖到批处理文件上,使其成为第一个参数,并设置将声明它的实例变量....远射...希望它有所帮助
答案 3 :(得分:0)
使用awk
并将字段分隔符设置为^
,您需要将其转义。
awk -F \^ '{ print NF; n+=1 }; END { print n }' temp.txt
将打印每行上的字段数,后跟行数 - 我相信您可以找到更好的用法,但它会为您提供一个起点。