BATCH:我想在文本文件中提取一个被单词包围的“表格”,并将这唯一的“表格”复制到新的文本文件中

问题描述 投票:0回答:1

我对批处理非常陌生,需要帮助...我的目标是读取文本文件中的数据表,并以相同的格式将其复制到另一个文本文件(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`
batch-file text extract
1个回答
0
投票
@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存在测试。
    

© www.soinside.com 2019 - 2024. All rights reserved.