PDA

Показать полную графическую версию : Добавить в начало каждой строки ее номер


papacoca
16-11-2014, 17:45
Как добавить на начало каждой строки ее номер.

Есть база синонимов в .txt файле такого типа:
вздваивание|сдвоение
вздваивать|удваивать
вздваиваю|удваиваю

Нужно переделать и сделать так:
(1, 'вздваивание|сдвоение'),
(2, 'вздваивать|удваивать'),
(3, 'вздваиваю|удваиваю'),

Нашел в интернете батник который добавляет символы в конец каждой строки, можно и в начало строки (#^%i):
for /f "delims=" %i in (1.txt) do @(echo %i^#)>>file2.txt

А вот как добывить № не нашел...

Iska
16-11-2014, 19:23
Пробуйте:
@echo off
setlocal enableextensions enabledelayedexpansion

set sSourceFile=%~1

call :GetTemporaryName

if defined sSourceFile (
if exist "%sSourceFile%" (
set /a iCount = 0

>"%TemporaryName%" (
for /f "usebackq delims=" %%i in ("%sSourceFile%") do (
set /a iCount += 1
echo ^(!iCount!, '%%i'^),
)
)

>nul copy /y "%sSourceFile%" "%~dpn1.bak"
>nul copy /y "%TemporaryName%" "%sSourceFile%"
del /f /q "%TemporaryName%"
) else (
echo Can't find source file [%sSourceFile%].
exit /b 2
)
) else (
echo Usage: %~nx0 ^<Source file^>
exit /b 1
)


endlocal
exit /b 0

rem ==========================================================================
rem Функция GetTemporaryName()
rem
rem Серый форум / CMD/BAT: генерация пути для временного файла или папки
rem (http://forum.script-coding.com/viewtopic.php?id=6259)
rem ==========================================================================
:GetTemporaryName
setlocal enableextensions enabledelayedexpansion

:NextName
set sTempName=%temp%\temp%random%.tmp

if exist "%sTempName%" goto :NextName

set sProcName=%~0

endlocal & set %sProcName:~4%=%sTempName%
exit /b 0
rem ==========================================================================

Можно просто перетащить исходный файл поверх командного файла в Проводнике. Пустые строки будут пропущены.

papacoca
16-11-2014, 21:08
Iska, спасибо большое, работает как часы...
Начал уже через Linux номера строк через консоль собирать такой командой: sed '/./=' baza.txt | sed '/./N; s/\n/, /'
Вот только консоль с кириллицей не дружит и номера строк почему то неправильные:((

если нетрудно, есть формат синонимов только уже через запятую:
весьма,очень
ветвей,веток
ветви,ветки

Нужно переделать и сделать так:
(1, 'весьма|очень'),
(2, 'ветвей|веток'),
(3, 'ветви|ветки'),

Foreigner
16-11-2014, 21:33
papacoca, Попробуй так:

@echo off
setlocal
1>nul chcp 1251

for /f "tokens=1,2 delims=," %%i in (1.txt) do call:1 %%i %%j
move 1.tmp 1.txt
1>nul chcp 866
goto:eof

:1
set /a n+=1
1>>1.tmp echo ^(%n%,%1^|%2^),

Sphinx114
16-11-2014, 21:42
И ещё вариант:
@echo off 1>&3 3>2.txt
setlocal enabledelayedexpansion
for /f "delims=" %%i in (1.txt) do (
set /a n+=1
set "str=%%i"
echo ^(!n!, '!str:,=^|!'^),
)
1.txt положить рядом с батником

Iska
16-11-2014, 21:49
Foreigner, жив курилка! Какими судьбами?! «Я, конечно, вернусь, не пройдёт и полгода…» (с)

papacoca, пробуйте, мой вариант:
@echo off
setlocal enableextensions enabledelayedexpansion

set sSourceFile=%~1

call :GetTemporaryName

if defined sSourceFile (
if exist "%sSourceFile%" (
set /a iCount = 0

>"%TemporaryName%" (
for /f "usebackq delims=" %%i in ("%sSourceFile%") do (
set /a iCount += 1
set sLine=%%i
echo ^(!iCount!, '!sLine:,=^|!'^),
)
)

>nul copy /y "%sSourceFile%" "%~dpn1.bak"
>nul copy /y "%TemporaryName%" "%sSourceFile%"
del /f /q "%TemporaryName%"
) else (
echo Can't find source file [%sSourceFile%].
exit /b 2
)
) else (
echo Usage: %~nx0 ^<Source file^>
exit /b 1
)


endlocal
exit /b 0

rem ==========================================================================
rem Функция GetTemporaryName()
rem
rem Серый форум / CMD/BAT: генерация пути для временного файла или папки
rem (http://forum.script-coding.com/viewtopic.php?id=6259)
rem ==========================================================================
:GetTemporaryName
setlocal enableextensions enabledelayedexpansion

:NextName
set sTempName=%temp%\temp%random%.tmp

if exist "%sTempName%" goto :NextName

set sProcName=%~0

endlocal & set %sProcName:~4%=%sTempName%
exit /b 0
rem ==========================================================================

papacoca
16-11-2014, 23:05
Foreigner
Работа скипта очень медленная: 7 Кб в сек.
Sphinx114
Работа моментальная.
Iska
Спасибо за испуг :) твой скрипт удалил все текстовые файлы в папке и сам батник удалился, радует хоть не на рабочем столе.

Вопрос, можно в файле в начале не с 1,2,3 нумеровать а с 668, 669, 700 и т.д.
а так:
"НАЧАЛО"
(668, 'весьма|очень'),
(669, 'ветвей|веток'),
(700, 'ветви|ветки'),

Просто мне нужно будет с разных .txt файлов лепит 1-ну базу.

Всем Огромное спасибо +1

Iska
16-11-2014, 23:46
Спасибо за испуг твой скрипт удалил все текстовые файлы в папке и сам батник удалился, радует хоть не рабочем столе. »
Пакетный файл, код которого я привёл, работает с одним (!) файлом, который указывается (!) первым (и единственным) параметром данного пакетного файла. Причём старая версия исходного файла сохраняется в том же каталоге и под тем же именем с расширением «.bak».

А уж насчёт «и сам батник удалился» я и вовсе теряюсь в догадках.

papacoca
16-11-2014, 23:54
Iska
Только что опять проверил с 1 текстовым документом и скриптом в папке все гуд!!

Вопрос, можно в файле в начале не с 1,2,3 нумеровать а с 668, 669, 700 и т.д.
так:

(668, 'весьма|очень'),
(669, 'ветвей|веток'),
(700, 'ветви|ветки'),

Georgio
17-11-2014, 03:15
@echo off

set "in=1.txt"
set "out=2.txt"
set start=668

set /a n=start-1
@>"%out%" 2>nul (
for /f "usebackq tokens=1* delims=," %%i in ("%in%") do @(
set /a n+=1
<nul call set /p=(%%n%%
echo , '%%i^|%%j'^),
)
)|| (echo The file not found or is empty.& pause>nul& exit /b 1)

exit /b 0

papacoca
17-11-2014, 19:12
Georgio
Спасибо все работает




© OSzone.net 2001-2012