Windows 批量替换具有上述内容的空单元格



我有一个文本文件,其中包含一些列表,如下所示。我想在第一列中填写缺失的数字,如图所示。

典型原文:

5  401     6      5.80      0.15    -3.56      0.61     -0.02       0.96
8     -6.11     -0.64     4.07      0.24      0.20       0.38
402     6     -0.33      1.07     0.30      1.29     -0.00       2.04
8      0.02     -0.59     0.21      0.50      0.22       0.79
403     6      3.77     -0.70    -2.74     -0.94      0.20      -1.48
8     -4.08      0.22     2.23     -0.06     -0.19      -0.09
404     6     -2.36      0.22     1.12     -0.26      0.21      -0.41
8      2.05      0.27    -1.63      0.20     -0.16       0.32
16  401    16     -6.30     -0.76    -3.61      0.64     -0.22      -1.01
227      5.99      0.27     4.12      0.47      0.15      -0.74
402    16    -12.50      0.14    -7.52     -0.01     -0.24       0.02
227     12.19      0.35     8.03      0.24      0.13      -0.38
403    16     20.48      0.19    12.84     -0.29      0.03       0.46
227    -20.79     -0.68   -13.35     -0.64     -0.18       1.02
404    16     14.28      1.09     8.93     -0.94      0.01       1.48
227    -14.59     -0.60    -9.44     -0.87     -0.21       1.38
709  401   374     -1.17     -0.99    25.11      0.63     -1.12      -0.11
204      1.05      0.79   -24.91     -0.19     -0.62       0.06
402   374     -1.55      1.09    30.49     -0.90     -1.40       0.14
204      1.43     -0.90   -30.28      0.41     -0.79      -0.09
403   374      1.90     -1.58     0.79      1.65      0.50      -0.21
204     -2.02      1.38    -0.99     -0.93      0.41       0.14
404   374      1.51      0.50     6.16      0.12      0.22       0.04
204     -1.64     -0.31    -6.37     -0.32      0.24      -0.02

我想要它如何:

5  401     6      5.80      0.15    -3.56      0.61     -0.02       0.96
5  401     8     -6.11     -0.64     4.07      0.24      0.20       0.38
5  402     6     -0.33      1.07     0.30      1.29     -0.00       2.04
5  402     8      0.02     -0.59     0.21      0.50      0.22       0.79
5  403     6      3.77     -0.70    -2.74     -0.94      0.20      -1.48
5  403     8     -4.08      0.22     2.23     -0.06     -0.19      -0.09
5  404     6     -2.36      0.22     1.12     -0.26      0.21      -0.41
5  404     8      2.05      0.27    -1.63      0.20     -0.16       0.32
16  401    16     -6.30     -0.76    -3.61      0.64     -0.22      -1.01
16  401   227      5.99      0.27     4.12      0.47      0.15      -0.74
16  402    16    -12.50      0.14    -7.52     -0.01     -0.24       0.02
16  402   227     12.19      0.35     8.03      0.24      0.13      -0.38
16  403    16     20.48      0.19    12.84     -0.29      0.03       0.46
16  403   227    -20.79     -0.68   -13.35     -0.64     -0.18       1.02
16  404    16     14.28      1.09     8.93     -0.94      0.01       1.48
16  404   227    -14.59     -0.60    -9.44     -0.87     -0.21       1.38
709  401   374     -1.17     -0.99    25.11      0.63     -1.12      -0.11
709  401   204      1.05      0.79   -24.91     -0.19     -0.62       0.06
709  402   374     -1.55      1.09    30.49     -0.90     -1.40       0.14
709  402   204      1.43     -0.90   -30.28      0.41     -0.79      -0.09
709  403   374      1.90     -1.58     0.79      1.65      0.50      -0.21
709  403   204     -2.02      1.38    -0.99     -0.93      0.41       0.14
709  404   374      1.51      0.50     6.16      0.12      0.22       0.04
709  404   204     -1.64     -0.31    -6.37     -0.32      0.24      -0.02

我以前遇到过类似的问题,其中两个"单元格"异常丢失(例如,上面的 402 到 404 数字也丢失了。然后我设法使用了这个脚本:

for /F "delims=" %%i in ('type "tmp1.txt"') do (
set row=%%i
set cnt=0
for %%l in (%%i) do set /A cnt+=1
if !cnt! equ 7 (
set row=!header! !row!
) else (
for /F "tokens=1,2" %%j in ("%%i") do set header=%%j %%k
)
echo.!row!
) >> "tmp2.txt"

知道有人吗?

假设文件格式化为空格(无 TAB(:

@echo off
setlocal enabledelayedexpansion
(for /f "delims=" %%a in (tmp1.txt) do (
set "line=%%a"
set "col1=!line:~0,3!"
set "col2=!line:~3,5!"
set "rest=!line:~8!"
if "!col1!" == "   " (
set "col1=!old1!"
) else (
set "old1=!col1!"
)
if "!col2!" == "     " (
set "col2=!old2!"
) else (
set "old2=!col2!"
)
echo !col1!!col2!!rest!
))>tmp2.txt

您会注意到,我不会将行拆分为带有for /f标记,而是将行作为一个整体并手动"拆分"它们以保留格式(子字符串的长度(。然后只需将"空值"替换为前面行中保存的值即可。

编辑以响应I have made a mistake when pasting the original text. There are 4 (empty) spaces before all lines.

调整计数如下(首先"令牌将长度增加4,其余的在起始位置添加4,保持长度不变(:

set "col1=!line:~0,7!"
set "col2=!line:~7,5!"
set "rest=!line:~12!"

并使if "!col1!" == " " (适应if "!col1!" == " " ((从三个到七个空格(

最新更新