Войти

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


method777
22-05-2017, 18:17
Подскажите решение моей проблемы... В папке имеется несколько текстовых файлов, нужно, чтобы в начало каждого файла добавилась нужная мне строка.
решение примерно такое: http://forum.oszone.net/thread-187587.html только нужно, чтобы строка вставлялась не в конец, а в начало

greg zakharov
22-05-2017, 19:44
Если не усложнять, то в простейшем случае решение может быть таким:
@echo off
setlocal enabledelayedexpansion
set "i=1"
set "arr.0=first string"
for /f "tokens=*" %%i in (file.txt) do (
set "arr.!i!=%%i"&set /a "i+=1"
)
set /a "i-=1"
cd.>file.txt
for /l %%i in (0, 1, !i!) do (
for /f "tokens=1,* delims==" %%j in (
'set arr.%%i'
) do echo:%%k>>file.txt
)
endlocal
exit /b
По-настоящему же крутым решение будет если "склеить" строку, которую необходимо вставить, с текстом "на лету", то есть перенаправив вывод в один из стандартных потоков консоли; правда придется задействовать con, но для начала разберитесь с примером выше, а дальше посмотрим.

NickM
22-05-2017, 20:03
Если приемлемо использование сторонних утилит (http://gnuwin32.sourceforge.net/packages/sed.htm), то простой примерчик будет выглядить так:
for %%i in (*.txt) do sed -i -e "1 s/^/нужная_Мне_строка\n/;" %%i

megaloman
22-05-2017, 21:16
@Echo Off

Set "Mask=Z:\Box_In\*.txt"

Set "Str=Нужная мне для вставки в начало текстового файла строка"

FOR %%f IN ("%Mask%") DO (
(Echo %Str% &More "%%f")>"%%f.tmp"
Move /Y "%%f.tmp" "%%f" >nul
)
Даже в этом решении возможны проблемы при наличии спецсимволов в тексте.
Если не принципиально, решение лучше сделать посредством .vbs-скрипта.

y--
22-05-2017, 22:41
All
как же вы любите все усложнять...
COPY /? и обращаем внимание на символ "+" в выводе справки. Дальше в принципе все очевидно.

megaloman
22-05-2017, 23:11
y--, @Echo Off

Set "BoxIn=Z:\Box_In"
Set "Mask=*.txt"
Set "Str=Нужная мне для вставки в начало текстового файла строка"

>"%BoxIn%\%~nx0.tmp" (Echo %Str%)

FOR %%f IN ("%BoxIn%\%Mask%") DO (
Copy /B "%BoxIn%\%~nx0.tmp"+"%%f" "%%f.tmp">nul
Move /Y "%%f.tmp" "%%f" >nul
)
del "%BoxIn%\%~nx0.tmp"

greg zakharov
23-05-2017, 09:32
как же вы любите все усложнять...А Вы утрировать. Вообще вполне ожидаемо было услышать про copy, команду имеющую довольно много побочных эффектов, к тому же для объединения файлов требуется создать отдельный файл (и как следствие отдельный поток), в то время, когда проще использовать потоки уже существующего файла. Но, как уже было верно подмечено, в командном языке непременно возникнут проблемы со спецсимволами и кодировками. Ну а если речь идет все же о командномм языке, то можете помедитировать над следующим.
rem тестовый файл для вставки строки
E:\src> more < con > test.txt
string 1
string 2
^Z

rem смотрим что получилось
E:\src> type test.txt
string 1
string 2

rem строку, которую нужно вставить, пишем в ADS
E:\src> echo:required string>test.txt:stream1

rem убеждаемся что содержимое файла не изменилось
E:\src> type test.txt
string 1
string 2

rem и что в созданном потоке хранится строка для вставки
E:\src> streams test.txt
E:\src\test.txt:
:stream1:$DATA 17

E:\> more < test.txt:stream1
required string

rem переносим строки из основного потока в созданный ADS
E:\> type test.txt>>test.txt:stream1
E:\> more < test.txt:stream1
required string
string 1
string 2

rem выводим ADS в основной поток
E:\> more < test.txt:stream1 > test.txt
E:\> type test.txt
required string
string 1
string 2

rem убеждаемся, что ADS при перезаписи основного потока был удален
E:\> streams test.txt

y--
23-05-2017, 12:06
greg zakharov
А Вы утрировать. »
не вопрос - исходник - текстовый файл на 1 миллион строчек, каждая из которых представляет собой один единственный символ.
Сравни быстродействие методов... и тогда понятно станет утрирую я или нет.

greg zakharov
23-05-2017, 12:50
Сравни быстродействие методов... и тогда понятно станет утрирую я или нет.Мы на брудершафт не пили, так что запанибратство, пожалуйста, оставьте при себе. Это во-первых. Во-вторых, кто в зравом уме и трезвой памяти станет создавать файл в миллион строк с одним единственным символом в каждой из оных? В-третьих, быстро не является синонимом хорошо, и если бы Вы удосужились разобрать исходный код copy, вряд ли стали раздавать столь порочные советы. Впрочем, людям свойственно очаровываться вещами оставляющими желать лучшего. Удачи!

megaloman
23-05-2017, 17:10
greg zakharov, Если приземлённо вникнуть в постановку и рассуждать без эмоций в деловом стиле, то возникает вопрос: а где решение поставленной задачи? В папке имеется несколько текстовых файлов, нужно, чтобы в начало каждого файла добавилась нужная мне строка. »
Если не усложнять, то в простейшем случае решение может быть таким: » Даже для одного файла это сомнительное решение. После работы Вашего скрипта исходный файл может быть сильно искажен 1 Варкалось!

Хливкие шорьки пырялись по наве!

И хрюкотали зелюки

Как мюмзики в мове!

2 Ехала деревня мимо мужика

Вдруг из-под собаки

Лают ворота!

3 Выбежала бабка с палкою в руке

4
Начала дубасить

Коня на мужике!

5
Лошадь ела сало,

А мужик овёс!

6
Лошадь села в сани,

А мужик повёз
можете помедитировать над следующим. » А реальное решение где?

y--
23-05-2017, 19:26
greg zakharov,
Уважамый - по-видимому Вы таки не в состоянии оценить быстродействие(по-видимому потому что создание тестового файла на 1 миллион строк для Вас также представляет определенные трудности).
Засим - с Вами(как минимум до брудершафта) обсуждать основную тему этого топика безсмысленно - бай...

greg zakharov
23-05-2017, 21:31
Если не переходить на личности, можно констатировать факт наличия довольно большого количества дегенератов на форуме.




© OSzone.net 2001-2012