如何在批处理脚本中检查unicode文件中用作“^”的分隔符

时间:2014-07-31 04:33:06

标签: batch-file

我有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%

上述方法有没有尝试过的选项?

4 个答案:

答案 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的情况下起作用。

为什么forset /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 

将打印每行上的字段数,后跟行数 - 我相信您可以找到更好的用法,但它会为您提供一个起点。