Разделите имя и фамилию с помощью цикла for - PullRequest
0 голосов
/ 04 июня 2019


Я работаю над пакетом, который создает .txt-файл из записи.Файл будет обработан позже другой программой.

На данный момент запись выглядит следующим образом:

11111;Lastname Firstname SecondFirstname;1234567;SomeText
22222;Lastname Firstname;1254557;SomeText
33333;Lastname Firstname;1234567;SomeText

Я хотел бы иметь точку с запятой между фамилией и именем.Проблема в предложениях с двумя именами.Здесь не должно быть точки с запятой между именами.

В конце все должно выглядеть так:

11111;Lastname;Firstname SecondFirstname;1234567;SomeText
22222;Lastname;Firstname;1254557;SomeText
33333;Lastname;Firstname;1234567;SomeText

У кого-нибудь есть идея?
Я попробовал следующее, но это не решает проблему с двумя первымиимена:

type nul>tmp.txt
for /f "delims=: tokens=1*" %%i in ('findstr /n "^" "test_output.txt"') do set "Zeile=%%j" &call :sub
move /y "tmp.txt" "test_output.txt"

goto :eof


:sub
if not defined Zeile (
    >>tmp.txt echo.
    goto :eof
)
>>tmp.txt echo %Zeile: =;%
goto :eof

Ответы [ 2 ]

2 голосов
/ 04 июня 2019

Вам нужно два вложенных for /F: первое разделить на точку с запятой, второе разделить на пространство, ограниченное двумя разбиениями.

Использование мета-переменных в верхнем регистре %A и в нижнем регистре %a, в строке cmd:

for /F "tokens=1-3* delims=;" %A in (test_output.txt) do @for /F "tokens=1*" %a in ("%B") do @Echo %A;%a;%b;%C;%D

В пакетном файле с сохранением в new_output.txt:

:: Q:\Test\2019\06\04\SO_56443069.cmd
@Echo off&SetLocal EnableDelayedExpansion

(for /F "tokens=1-3* delims=;" %%A in (test_output.txt
  ) do for /F "tokens=1*" %%a in ("%%B"
  ) do Echo %%A;%%a;%%b;%%C;%%D
) >new_output.txt 

Пример вывода:

> type new_output.txt
11111;Lastname;Firstname SecondFirstname;1234567;SomeText
22222;Lastname;Firstname;1254557;SomeText
33333;Lastname;Firstname;1234567;SomeText
2 голосов
/ 04 июня 2019

Первый раз с разделителем ; и второй токен (третий, если вы учитываете номера строк) второй раз с разделителем <SPACE>tokens=1,*) решает вашу проблему:

@echo off
(for /f "tokens=1-3,* delims=;:" %%A in ('findstr /n "^" "test_output.txt"') do (
if "%%B"=="" echo/
  for /f "tokens=1,*" %%M in ("%%C") do (
   echo/%%B;%%M;%%N;%%D
  )
))>tmp.txt
goto :eof

(перенаправление всего вывода за раз намного быстрее, чем перенаправление отдельных строк - особенно с большими файлами)

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