Компьютерный форум 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=326973)

method777 22-05-2017 18:17 2738718

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

greg zakharov 22-05-2017 19:44 2738744

Если не усложнять, то в простейшем случае решение может быть таким:
Код:

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

Если приемлемо использование сторонних утилит, то простой примерчик будет выглядить так:
Код:

for %%i in (*.txt) do sed -i -e "1 s/^/нужная_Мне_строка\n/;" %%i

megaloman 22-05-2017 21:16 2738760

Код:

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

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

megaloman 22-05-2017 23:11 2738787

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 2738867

Цитата:

Цитата y--
как же вы любите все усложнять...

А Вы утрировать. Вообще вполне ожидаемо было услышать про 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 2738917

greg zakharov
Цитата:

Цитата greg zakharov
А Вы утрировать. »

не вопрос - исходник - текстовый файл на 1 миллион строчек, каждая из которых представляет собой один единственный символ.
Сравни быстродействие методов... и тогда понятно станет утрирую я или нет.

greg zakharov 23-05-2017 12:50 2738927

Цитата:

Цитата y--
Сравни быстродействие методов... и тогда понятно станет утрирую я или нет.

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

megaloman 23-05-2017 17:10 2739035

greg zakharov, Если приземлённо вникнуть в постановку и рассуждать без эмоций в деловом стиле, то возникает вопрос: а где решение поставленной задачи?
Цитата:

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

Цитата:

Цитата greg zakharov
Если не усложнять, то в простейшем случае решение может быть таким: »

Даже для одного файла это сомнительное решение. После работы Вашего скрипта исходный файл может быть сильно искажен
А вот этот файл file.txt вообще обрабатывается криво
Код:

1 Варкалось!

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

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

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

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

        Вдруг из-под собаки
       
        Лают ворота!

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

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

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

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

        А мужик овёс!

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

А мужик повёз

Цитата:

Цитата greg zakharov
можете помедитировать над следующим. »

А реальное решение где?

y-- 23-05-2017 19:26 2739073

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

greg zakharov 23-05-2017 21:31 2739103

Если не переходить на личности, можно констатировать факт наличия довольно большого количества дегенератов на форуме.


Время: 19:47.

Время: 19:47.
© OSzone.net 2001-