【问题标题】:Processing an input file in batch批量处理输入文件
【发布时间】:2012-06-13 13:39:05
【问题描述】:

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

  1. 输入文件中的每一行都有不同的信息,所以我希望批处理循环遍历每一行。
  2. 我想从输入文件中提取某些信息并丢弃其余信息。
  3. 输入文件可以有任意数量的行。
  4. 如果输入行没有有用的信息,我想留下一条错误消息。
  5. 我需要两个计数器,第一个告诉输入文件中的行数,第二个告诉输出文件中的行数(不计算空行)。
  6. 我希望批处理将特殊字符视为普通字母。

例如:

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

我只想提取 FILE_NAME=XXXFILE_SIZE=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

【问题讨论】:

  • 我知道这不是批处理文件方法,所以可能不适合,但是 awk 和 sed 都是(linux)命令行工具,用于重新排列文本行,例如这个。
  • 也许您可以从 UnxUtils 项目中下载 sedawk 版本并在批处理文件中使用它们。

标签: batch-file


【解决方案1】:

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

@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

下面是关于它的作用的一点解释:

  1. 第一个for 循环逐行读取文件,每行的内容作为输入参数发送到ParseLine 子例程。
  2. ParseLine 子例程接收str 中的每一行并遍历其以空格分隔的单词(使用描述为here 的jeb 高级方法)。
    子程序循环的逻辑非常简单:它将每个单词分成tag= 之前的文本)和value= 之后的文本),并设置file_namefile_size相应地。

我相信这种方法几乎可以处理任何输入文件,无论有无特殊字符。

【讨论】:

  • 好的,但所有变量 FILE_NAME 和 FILE_SIZE 都会改变,但我想为其中 1 个变量做这些
  • @user1447199 - 你不应该完全改变你的问题,最好问一个新问题。这是一个很大的区别,如果它是 XML、CSV 或自定义格式
  • help plz ,我注意到如果输入文件名在这一行中有空格 for /f "tokens=*" %%s in (%INPUT_FILE%) do call :ParseLine " %%s" ,我尝试输入 "%INPUT_FILE%" 但没用,有解决办法吗?
  • 我找到了一个有效的解决方案,我做了这样的交换,设置 input2="%INPUT_FILE%" 然后: for /f "tokens=*" %%s in (%input2%) do调用 :ParseLine "%%s" 并且它有效,但也许有更聪明的解决方案
  • 我有一个问题,是否可以使用单词而不是= 作为分隔符
猜你喜欢
  • 2010-10-23
  • 2014-10-02
  • 1970-01-01
  • 1970-01-01
  • 2014-09-06
  • 2011-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多