我对批处理非常陌生,需要帮助...我的目标是读取文本文件中的数据表,并以相同的格式将其复制到另一个文本文件(output.txt)中。但是,第一个文本文件(我们称之为 input.txt)中的表格被其他文本包围。
优点是我的表以字符串“element”开头,并在 input.txt 的末尾结束。所以这是我想要提取并复制到我的output.txt 中的input.txt 的唯一部分。 另一个问题是字符串“element”不是直接位于要提取的表格第一行的开头(有一些空格)。
这是我尝试从中提取表格的文本文件(input.txt):
Recapitulation des donnees
Nom fichier H46 en entree : cas.h46Nom fichier sigma en entree : sigma.txtNom fichier Inp en sortie : ficRes.inpNom fichier H46 en sortie : ficRes.h46Nom fichier TXT en sortie : ficRes.txtEtat limite : ELS
Es : 200000.00fck : 40.00Coefficient d'equivalence : 13.07Eb : 15302.22fctm : 3.51types dIFferents de sections : 1kt : 0.40
Caracteristiques de ferraillage a chaque niveau:
AX AY PhiX PhiY SpX SpY EnrX EnrY cX cYType : 115.71 15.71 20.00 20.00 200.00 200.00 74.00 98.00 62.00 86.0015.71 15.71 20.00 20.00 200.00 200.00 74.00 98.00 62.00 86.00
element type cas it ep sigaxi sigaxs sigayi sigays sigbpp itred AXI AXS AYI AYS ATR
1 1 1 3 0.50 159.13 159.13 -12.08 -12.08 -0.92 0 15.71 15.71 15.71 15.71 0.00
1 1 2 8 0.50 158.21 158.21 156.09 156.09 -2.00 4 15.71 15.71 16.11 16.11 0.00
1 1 3 18 0.50 192.73 192.73 74.42 74.42 -2.15 61 21.81 21.81 15.71 15.71 0.00
1 1 4 7 0.50 192.68 -52.76 0.00 0.00 -7.78 196 35.31 15.71 15.71 15.71 0.00
1 1 5 21 0.50 192.99 -31.15 30.25 155.89 -9.88 266 42.31 15.71 15.71 34.41 0.00
1 1 6 9 0.50 0.00 0.00 156.08 -9.88 -4.73 228 15.71 15.71 38.51 15.71 0.00
1 1 7 30 0.50 193.14 28.28 22.66 155.85 -9.69 225 38.21 15.71 15.71 23.41 0.00
1 1 8 9 0.50 0.00 0.00 -20.49 155.91 -5.75 118 15.71 15.71 15.71 27.51 0.00
1 1 9 1 0.50 159.13 159.13 0.00 0.00 0.00 0 15.71 15.71 15.71 15.71 0.00
1 1 10 1 0.50 0.00 0.00 156.15 156.15 0.00 3 15.71 15.71 16.01 16.01 0.00
1 1 11 8 0.50 158.51 158.51 155.80 155.80 -1.00 4 15.71 15.71 16.11 16.11 0.00
1 1 12 8 0.50 158.51 158.51 155.80 155.80 -1.00 4 15.71 15.71 16.11 16.11 0.00
1 1 13 20 0.50 185.89 -5.65 155.97 -5.36 -11.36 317 34.91 15.71 47.41 15.71 0.00
1 1 14 20 0.50 185.89 -5.65 155.97 -5.36 -11.36 317 34.91 15.71 47.41 15.71 0.00
1 1 15 1 0.50 159.13 159.13 95.48 95.48 0.00 0 15.71 15.71 15.71 15.71 0.00
你能帮我吗
这是我的尝试:
@echo off
set local enable delayed expansion
set "input_file=input.txt"
set "output_file=output.txt"
:: Are we in the table?
set "in_table="
:: Temporary file to stock the data
set "temp_file=%temp%\\temp_table.txt"
del "%temp_file%" 2\>nul
:: Go through input.txt
for /f "delims=" %%a in (%input_file%) do (
set "ligne=%%a"
:: Does the line has "element" in it ?
echo !ligne! | find /i "element" >nul
if !errorlevel! == 0 (
set "in_table=1"
)
:: If we are in the table, add the line to the temporary file
if defined in_table (
echo !ligne!>> "%temp_file%"
)
)
:: Copy the temporary file to the output file
type "%temp_file%" \> "%output_file%"
:: Delete temporary file
del "%temp_file%" 2\>nul
endlocal`
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
rem The following settings for the directories and filenames are names
rem that I use for testing and deliberately includes spaces to make sure
rem that the process works using such names. These will need to be changed to suit your situation.
SET "sourcedir=u:\your files"
SET "destdir=u:\your results"
SET "filename1=%sourcedir%\q77258106.txt"
SET "outfile=%destdir%\outfile.txt"
SET "intable="
(
FOR /f "usebackqdelims=" %%b IN ("%filename1%") DO (
SET "line=%%b"
IF DEFINED intable (
ECHO %%b
) ELSE (
IF "!line:element=!" neq "%%b" SET "intable=o"
)
)
)>"%outfile%"
GOTO :EOF
在应用于真实数据之前,始终验证测试目录。
请注意,如果文件名不包含空格等分隔符,则
usebackq
和 %filename1%
周围的引号都可以省略。
您需要更改分配给
sourcedir
和 targetdir
的值以适合您的情况。该列表使用适合我的系统的设置。
我故意在名称中包含空格,以确保空格得到正确处理。
我使用了一个名为
q77258106.txt
的文件,其中包含您的测试数据。
生成定义为
%outfile%
的文件
首先,确保
intable
设置为 nothing,这使得它 undefined
。
对于文件中的每一行,将该行分配给
%%b
,然后分配给 line
。
如果定义了
intable
,则写出%%b
中的行,否则查看将字符串line
替换为nothing的
element
是否与%%b
相同。如果不等于 (neq
),则 set
变量 intable
为 something(任何东西;重点是 intable
将被定义,然后代码将针对剩余行执行 echo %%b
)
请参阅提示中的
set /?
或数千个 SO 项目,以获取有关 !var:string=replacement!
语法的文档
整个
for
语句然后(括在括号中)并重定向到输出文件,这将创建一个新文件或覆盖任何现有文件。
因此无需使用临时文件或删除任何现有的输出文件。
您应该注意,在代码中,在块语句
(a parenthesised series of statements)
中,应使用 REM
语句而不是破碎标签注释形式 (:: comment
),因为标签终止块,会造成混淆 cmd
。 ::
是一个损坏的标签,因为您无法使用 ::
到达 goto
,但它仍然是一个标签。
逻辑的第二个问题是,
element
的测试是在测试in_table
是否已定义之前执行的,因此包含element
的行将设置in_table
,然后该行将是echo
编辑为 in_table
现已设置。您需要在测试element
后进行in_table
存在测试。