Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 批处理输入文件_Batch File - Fatal编程技术网

Batch file 批处理输入文件

Batch file 批处理输入文件,batch-file,Batch File,我想写一个批处理文件来读取输入文本文件,从中提取信息并将其放入输出文件中 输入文件中的每一行都有不同的信息,因此我希望批处理在每一行中循环 我想从输入文件中提取某些信息,并放弃其余信息 输入文件可以有任意数量的行 如果输入行没有有用的信息,我想留下一条错误消息 我需要两个计数器,第一个告诉输入文件中的行数,第二个告诉输出文件中的行数(不计算空行) 我希望该批处理像普通字母一样处理特殊字符 例如: FILE_NAME=apple FILE_SIZE=312 C=fwef sdf asdet

我想写一个批处理文件来读取输入文本文件,从中提取信息并将其放入输出文件中

  • 输入文件中的每一行都有不同的信息,因此我希望批处理在每一行中循环
  • 我想从输入文件中提取某些信息,并放弃其余信息
  • 输入文件可以有任意数量的行
  • 如果输入行没有有用的信息,我想留下一条错误消息
  • 我需要两个计数器,第一个告诉输入文件中的行数,第二个告诉输出文件中的行数(不计算空行)
  • 我希望该批处理像普通字母一样处理特殊字符
  • 例如:

    FILE_NAME=apple FILE_SIZE=312     C=fwef sdf asdetg
    
    FILE_SIZE=7867 C=ehtrghr  FILE_NAME=sea&ocean G=tryr    yujg
    C=gert FILE_NAME=chair=12 tgrgd sfsf FILE_SIZE=66
    dfgg ertergf C=ert A=344
    
    fgdfg FILE_NAME=cat
    
    我只想提取
    文件名=XXX
    文件大小=XXX
    部分,丢弃该行中的所有其他内容。输出应为:

    -name apple -size 312
    -name sea&ocean -size 7867
    -name chair=12 -size 66
    ERROR!!!
    -name cat
    
     input_count=5 and output_count=4
    

    人们对批处理脚本没有给予足够的信任。试试这个:

    @echo off
    setlocal enableDelayedExpansion
    set INPUT_FILE=input.txt
    set OUTPUT_FILE=output.txt
    set INPUT_COUNT=0
    set OUTPUT_COUNT=0
    
    :: Read the input file
    for /f "tokens=*" %%s in (%INPUT_FILE%) do call :ParseLine "%%s"
    echo. >>%OUTPUT_FILE%
    echo input_count=!INPUT_COUNT! and output_count=!OUTPUT_COUNT! >>%OUTPUT_FILE%
    exit /b
    
    :: Parse one line and write to output
    :ParseLine
    set "str=%~1"
    set ^"str=!str: =^
    
    !"
    set file_name=
    set file_size=
    for /f "eol=  tokens=1,2 delims==" %%a in ("!str!") do (
        set "tag=%%a"
        set "value=%%b"
        if "!tag!" equ "FILE_NAME" set "file_name=-name !value!"
        if "!tag!" equ "FILE_SIZE" set "file_size=-size !value!"
    )
    set /a input_count+=1
    if "!file_name!" equ "" if "!file_size!" equ "" (
        echo ERROR^^!^^!^^! >>%OUTPUT_FILE%
        goto Done
    )
    echo.!file_name! !file_size! >>%OUTPUT_FILE%
    set /a output_count+=1
    :Done
    
    这里有一点关于它的作用的解释:

  • 第一个
    for
    循环逐行读取文件,每行的内容作为输入参数发送到
    ParseLine
    子例程
  • ParseLine
    子例程接收
    str
    中的每一行,并通过其空格分隔的字进行迭代(使用所述的jeb高级方法)。
    子程序循环的逻辑非常简单:它将每个单词分成
    标记
    (前面的文本
    =
    )和
    (后面的文本
    =
    ),并相应地设置
    文件名
    文件大小

  • 我相信这个方法可以处理几乎所有的输入文件,有或没有特殊字符。

    我知道这不是批处理文件方法,所以可能不适合,但awk和sed都是(linux)用于重新排列文本行的命令行工具,如此。也许您可以从UnxUtils项目下载
    sed
    awk
    版本,并在批处理文件中使用它们。好的,但对于所有变量file\u NAME和file\u SIZE,这将更改,但我想为其中的1个变量执行此操作them@user1447199-你不应该改变你的问题完全地,最好问一个新的。这是一个很大的区别,如果是XML、CSV或自定义formathelp plz,我注意到如果输入文件名在这一行中为/f“tokens=*”%%s in(%input_file%)do call:ParseLine“%%s”留有空格会出现问题,我尝试放置“%input_file%”,但没有解决方案?我找到了一个有效的解决方案,我做了这样的交换,设置input2=“%INPUT\u FILE%”,然后:for/f“tokens=*”%%s in(%input2%)调用:ParseLine“%%s”,它就起作用了,但也许有一个更聪明的解决方案。我有一个问题,是否可以使用单词而不是
    =
    作为分隔符