Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Добавить в начало каждой строки ее номер (http://forum.oszone.net/showthread.php?t=291067)

papacoca 16-11-2014 17:45 2430332

Добавить в начало каждой строки ее номер
 
Как добавить на начало каждой строки ее номер.

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

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

Нашел в интернете батник который добавляет символы в конец каждой строки, можно и в начало строки (#^%i):
Код:

for /f "delims=" %i in (1.txt) do @(echo %i^#)>>file2.txt
А вот как добывить № не нашел...

Iska 16-11-2014 19:23 2430382

Пробуйте:
Скрытый текст
Код:

@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 2430429

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

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

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

Foreigner 16-11-2014 21:33 2430438

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 2430442

И ещё вариант:
Код:

@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 2430446

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 2430474

Цитата:

Foreigner
Работа скипта очень медленная: 7 Кб в сек.
Цитата:

Sphinx114
Работа моментальная.
Цитата:

Iska
Спасибо за испуг :) твой скрипт удалил все текстовые файлы в папке и сам батник удалился, радует хоть не на рабочем столе.

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

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

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

Iska 16-11-2014 23:46 2430489

Цитата:

Цитата papacoca
Спасибо за испуг твой скрипт удалил все текстовые файлы в папке и сам батник удалился, радует хоть не рабочем столе. »

Пакетный файл, код которого я привёл, работает с одним (!) файлом, который указывается (!) первым (и единственным) параметром данного пакетного файла. Причём старая версия исходного файла сохраняется в том же каталоге и под тем же именем с расширением «.bak».

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

papacoca 16-11-2014 23:54 2430496

Цитата:

Iska
Только что опять проверил с 1 текстовым документом и скриптом в папке все гуд!!

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

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

Georgio 17-11-2014 03:15 2430547

Код:

@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 2430956

Цитата:

Georgio
Спасибо все работает


Время: 21:26.

Время: 21:26.
© OSzone.net 2001-