Пакет Windows заменяет пустые ячейки вышеуказанным содержимым - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть текстовый файл с некоторым списком, как показано ниже. Я хочу заполнить пропущенные числа в первых столбцах, как показано.

Типичный исходный текст:

  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"

Идея кому-нибудь?

1 Ответ

0 голосов
/ 24 сентября 2019

Предполагается, что файл отформатирован с пробелами (без табуляции):

@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!" == " " ( (от трех до семи пробелов)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...