Войти

Показать полную графическую версию : [решено] Нумерация строк кроме первой


minutka15
02-02-2023, 19:15
Есть текстовый файл 1.txt где нужно пронумеровать все строки не затрагивая при этом самую верхнюю.

Что-бы стало

Постоянная строка
1=Строка один
2=Строка два
3=Еще строка

При помощи батника пронумеровываю


@echo off
<1.txt>$ (for /f "tokens=1* delims=[]" %%a in ('find /n /v ""') do @<nul set /p="%%a=%%b"& echo:)& >nul move $ 2.txt


Однако пронумеровывается и верхняя строка.

Как пронумеровать без затрагивания верхней строки ?

DJ Mogarych
02-02-2023, 20:10
Это CSV с заголовком, что ли?

minutka15
02-02-2023, 21:12
Это CSV с заголовком, что ли? »
Нет, это ini файл.
Что-бы решить эту проблему я сперва удаляю первую строку
@Echo Off
more +1 "1.txt" >"1.txt.new"
move /y "1.txt.new" "1.txt" >nul
Затем пронумеровываю
@echo off
<1.txt>$ (for /f "tokens=1* delims=[]" %%a in ('find /n /v ""') do @<nul set /p="%%a=%%b"& echo:)& >nul move $ 2.txt
И в последнюю очередь добавляю Постоянную строку
Set "Mask=1.txt"
Set "Str=Постоянная строка"
FOR %%f IN ("%Mask%") DO (
more +1 %Mask% > "%%f.tmp"
(Echo %Str% &More "%%f")>"%%f.tmp"
Move /Y "%%f.tmp" "%%f" >nul
)
exit /b

Получается как нужно но через белиберду
А хотелось бы одной строкой...

DJ Mogarych
02-02-2023, 22:22
Powershell

$iniFile = "C:\temp\from\1.txt"

$ini = ($ini = gc $iniFile) |% {
if ($ini.IndexOf($_) -ne 0) {$_ -replace "^","$($ini.IndexOf($_))="}
else {$_}
}
$ini |Set-Content $iniFile

Результат

Начало
1=один
2=два
3=три
4=четыре
5=пять
6=шесть
7=семь
8=восемь
9=девять
10=десять
11=одиннадцать
12=двенадцать
13=тринадцать
14=четырнадцать
15=пятнадцать
16=шестнадцать
17=семнадцать
18=восемнадцать
19=девятнадцать
20=двадцать

megaloman
03-02-2023, 09:42
Вариант?@Echo Off
cls
Set "FileIn=Z:\Box_In\1.ini"
Set "FileOut=Z:\Box_In\1.ini.new"

Set /A n=100000, i=0
Set /P @@%n%=<"%FileIn%"
FOR /F "usebackq delims=" %%b In (`2^>nul More +1 "%FileIn%"`) DO (
Set /A n+=1, i=i+1
Call Set "@@%%n%%=%%i%%=%%b"
)
>"%FileOut%" (FOR /F "usebackq tokens=1* delims==" %%b In (`2^>nul Set "@@"`) DO Echo %%c)
pause
Exit /B 0
FileIn и FileOut могут совпадать

El Sanchez
03-02-2023, 13:37
Вариант 2?

@echo off
(set i=0&for /f "tokens=1* delims=:" %%a in ('findstr /R /N "^" 1.txt') do if "%%~a"=="1" (echo:%%b) else (set /a i+=1&&call echo:%%i%%=%%b))>2.txt

minutka15
03-02-2023, 15:19
Вчера перед сном стал изобретать велосипед а изобрел самокат.

@echo off
Set "Mask=1.ini"
Set "Str=Постоянная строка"
more +1 "%Mask%" >"1.ini.new"
move /y "1.ini.new" "%Mask%" >nul
<%Mask%>$ (for /f "tokens=1* delims=[]" %%a in ('find /n /v ""') do @<nul set /p="%%a=%%b"& echo:)& >nul move $ %Mask%
FOR %%f IN ("%Mask%") DO (
more +1 %Mask% > "%%f.tmp"
(Echo %Str% &More "%%f")>"%%f.tmp"
Move /Y "%%f.tmp" "%%f" >nul
)
exit /b
Батник сперва удаляет "Постоянная строка", затем идет нумерация и в конце добавляет "Постоянная строка".
Стыдно конечно за такой батник но тем не менее от рабочий.

megaloman,
Ваш батник делает все как надо - супер! Спасибо огромное!

El Sanchez,
Ваш вариант отличный, в одну строку!
Спасибо огромное!
добавил
move /y "2.txt" "1.txt" >nul
и получил что хотел.

Спасибо всем.

Тема решена




© OSzone.net 2001-2012