Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Соединить несколько текстовых файлов в один

Ответить
Настройки темы
CMD/BAT - [решено] Соединить несколько текстовых файлов в один

Новый участник


Сообщения: 6
Благодарности: 0

Профиль | Отправить PM | Цитировать


Привет форумчане.
Нужен bat, который сможет соединить несколько текстовых файлов в один и второй bat, который сможет их разделить. (создавая подкаталоги)

Нашел вот такой неплохой вариант.

Соединитель:
Код: Выделить весь код
@echo off
 
set "result=outfile.txt"
 
>nul subst/d ?:& subst ?: .& pushd ?:\
>"%result%" (
for /f "tokens=* delims=?:\" %%i in ('2^>nul dir/a-d/b/s *.txt') do @(
 if "%%i" neq "%result%" (
  echo [%%i]
  <"%%i" more| more
 )
)
)
subst/d ?:& popd
 
exit/b 0
Разделитель:
Код: Выделить весь код
@echo off
 
set "result=outfile.txt"
 
for /f %%i in ('^<"%result%" find/c /v ""') do <"%result%" (
 for /l %%j in (1 1 %%i) do @(
  set "x="
  set/p x=
  if defined x (
   (
   for /f "delims=" %%k in ('
    cmd/v/c if "!x!" equ "[!x:~1,-1!]" echo "!x:~1,-1!"
   ') do @(
    2>nul md "%%~dpk"
    rem:>"%%k"
    set y=%%k
   )
   )|| if defined y cmd/v/c ">>!y! echo.!x!"
  ) else if defined y cmd/v/c ">>!y! echo."
 )
)
 
exit/b 0

Но при разделении файлов, в каждом файле образуется по новой, пустой строчке... (после текста)

И если такое возможно, то можно не изменять кодировку текстовика? У меня файлы в кодировке UCS-2 LE BOM, а после разделения файлы меняют кодировку на OEM 866.


Буду очень благодарен если поможете.

Отправлено: 17:38, 28-07-2017

 

Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Какова глобальная цель?
  1. «соединить несколько текстовых файлов в один» — зачем?
  2. «второй bat, который сможет их разделить» — каким макаром? Чтобы разделять нужен разделитель, причём заведомо уникальный. В приведённом коде видно, что используется пара символов ограничителей []. Какова гарантия, что они не встретятся в содержимом файлов?
  3. «создавая подкаталоги» — ?! Вы хотели сказать, что файлы, слитые из подкаталогов, должны восстанавливаться в такую же структуру каталогов, так?

Цитата uraabk:
У меня файлы в кодировке UCS-2 LE BOM »
Пакетные файлы не особо гожи для этого. WSH/PoSH.

Главный вопрос после прочтения изложенного — зачем Вы изобретаете велосипед? К чему эти слияния-извлечения (см. вопрос в начале сообщения)? Если только для указанного — возьмите 7-Zip/WinRAR и пользуйте.

Отправлено: 17:52, 28-07-2017 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 6
Благодарности: 0

Профиль | Отправить PM | Цитировать


1. Есть много папок с текстовыми файлами. Что бы не лазить по каждой папки/файлу, удобнее все собрать в один текстовик и потом с ним работать. А по окончанию запустить "разделитель", что бы все разложилось по полочкам)

2. [] - их там нет, не волнуйтесь)

3. Да, к примеру если случайно будут удалены некоторые папки, такой bat сможет восстановить папку и файл.

Цитата Iska:
Пакетные файлы не особо гожи для этого. WSH/PoSH.
Я не силен в этом) Если подскажите более удобный способ, буду только рад.

Отправлено: 18:09, 28-07-2017 | #3


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата uraabk:
Что бы не лазить по каждой папки/файлу, удобнее все собрать в один текстовик и потом с ним работать. »
Я не могу с Вами согласиться. Что за работа?

Цитата uraabk:
если случайно будут удалены некоторые папки, такой bat сможет восстановить папку и файл. »
Резервирование, резервирование и ещё раз резервирование.

Цитата uraabk:
Я не силен в этом) Если подскажите более удобный способ, буду только рад. »
Распишите подробнее, что за работа такая.
Упакуйте несколько таких файлов (и со вложенными каталогами) в архив, каковой прикрепите к сообщению, либо выложите на RGhost или Яндекс.Диск.

Отправлено: 18:22, 28-07-2017 | #4


Новый участник


Сообщения: 6
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата Iska:
Что за работа? »
А какое отношение это имеет к данной проблеме? Я прошу доработать уже созданный bat или подсказать что поудобнее.

Цитата Iska:
Резервирование, резервирование и ещё раз резервирование. »
В данном случае резервирование будет в файле outfile.txt

Цитата Iska:
Упакуйте несколько таких файлов »
А в файлах что вы не видели? Обычный текст на русском/английском, в некоторых местах с применением html тэгов по типу <color>, <br>

Отправлено: 18:31, 28-07-2017 | #5


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата uraabk:
А какое отношение это имеет к данной проблеме? »
Пока не знаю. Расскажете — смогу делать какие-либо предположения на предмет «какое отношение имеет».

Цитата uraabk:
Я прошу доработать уже созданный bat или подсказать что поудобнее. »
Вот ровно для того же меня интересует озвученное мною. Чтобы доработать или что-то вменяемое подсказать.

Цитата uraabk:
В данном случае резервирование будет в файле outfile.txt »
Это неудачный выбор.


Цитата uraabk:
А в файлах что вы не видели? »
Содержимого.


Зачем всё вот это нужно.
Например, задача (задача! не выбранный Вами способ решения, а сама задача) может не нуждаться в решении или может нуждаться в ином решении, нежели выбранное Вами. Например, чтобы мне, либо кому-то другому не пришлось самостоятельно изготавливать каталоги с файлами в формате UTF-16 LE с BOM для того, чтобы написать и отладить код. А затем внезапно обнаружить, что у Вас код не работает, например, потому, что Ваши файлы, вопреки изложенному, не в этом формате. Или концы строк отличаются от Windows-стандарта, а идут в Unix или Mac-формате. Или представляют собой одну длинную строку, на которой код тупо не работает. Или ещё что. Подобное бывало не раз, не два, и не три. А происходит стабильно.

Потому и задаётся два вопроса: изложите задачу и приложите образцы исходных данных. И только. Ни чем именно Вы там заниматесь, ни содержание Ваших секретных файлов абсолютно не интересно, пусть Вы там хоть нетленку в стиле садомазо ваяете, не в этом дело. Понимаете?

Отправлено: 19:18, 28-07-2017 | #6


Ветеран


Сообщения: 3806
Благодарности: 824

Профиль | Отправить PM | Цитировать


Гениально! - вот как можно работать с кодом на iPad! - возьму на заметку.

Отправлено: 20:31, 28-07-2017 | #7


Новый участник


Сообщения: 6
Благодарности: 0

Профиль | Отправить PM | Цитировать


Ну вот, смотрите. Кстати попробовал свои бат введя в тексте "[текст]" и все нормально работало...)

Отправлено: 20:40, 28-07-2017 | #8


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата Busla:
вот как можно работать с кодом на iPad »
А что там? Не могли бы пояснить разницу «до» и «после» несведущему?


Цитата uraabk:
Ну вот, смотрите. »
А что с моим вопросом про глобальную цель?


Как-то так (PowerShell):
Joiner.ps1
Код: Выделить весь код
Param(
    [System.String]$DestFile     = 'outfile.txt'
    [System.String]$SourceFolder = $pwd,
)

if(Test-Path -Path $SourceFolder -PathType Container) {
    $cContent = Get-ChildItem -Path $SourceFolder -File -Recurse -Include '*.txt' -Exclude $DestFile | ForEach-Object -Process {
            "[$(($_.FullName).Remove(0, $SourceFolder.Length + 1))]`r`n" + [System.IO.File]::ReadAllText($_.FullName, [System.Text.Encoding]::Unicode) + "`r`n"
        }
    [System.IO.File]::WriteAllLines((Join-Path -Path $SourceFolder -ChildPath $DestFile), $cContent, [System.Text.Encoding]::Unicode)
} else {
    Write-Host "Can't find source folder [$SourceFolder]." -ForegroundColor Red
}
Именем результирующего файла по умолчанию является «outfile.txt», исходным каталогом по умолчанию — текущий каталог (могут быть переопределены заданием параметров при вызове скрипта).

Splitter.ps1
Код: Выделить весь код
Param(
    [System.String]$SourceFile = 'outfile.txt',
    [System.String]$DestFolder = $pwd
)

if(Test-Path -Path $SourceFile -PathType Leaf) {
    if(Test-Path -Path $DestFolder -PathType Container) {
        $sContent = [System.IO.File]::ReadAllText($SourceFile, [System.Text.Encoding]::Unicode)
        $oRegExp = New-Object -TypeName 'System.Text.RegularExpressions.Regex' -ArgumentList '\[(.+)\]\r\n([\s\S]*?)(?:\r\n){2}(?=\[.+\]|$)'

        if($oRegExp.IsMatch($sContent)) {
            $oRegExp.Matches($sContent) | ForEach-Object -Process {
                $sCurrDestFile   = Join-Path  -Path $DestFolder -ChildPath $_.Groups[1].Value
                $sCurrDestFolder = Split-Path -Path $sCurrDestFile -Parent

                if(-not (Test-Path -Path $sCurrDestFolder -PathType Container)) {
                    New-Item -ItemType Directory -Path $sCurrDestFolder -Force | Out-Null
                }
                
                [System.IO.File]::WriteAllText($sCurrDestFile, $_.Groups[2].Value, [System.Text.Encoding]::Unicode)
            }
        } else {
            Write-Host "Can't find any match in file [$SourceFile]." -ForegroundColor Red
        }
    } else {
        Write-Host "Can't find destination folder [$DestFolder]." -ForegroundColor Red
    }
} else {
    Write-Host "Can't find source file [$SourceFile]." -ForegroundColor Red
}
Именем исходного файла по умолчанию является «outfile.txt», целевым каталогом по умолчанию — текущий каталог (могут быть переопределены заданием параметров при вызове скрипта).
Это сообщение посчитали полезным следующие участники:

Отправлено: 05:18, 29-07-2017 | #9


Новый участник


Сообщения: 6
Благодарности: 0

Профиль | Отправить PM | Цитировать


Iska, спасибо вы просто великолепны!) Правда пришлось изменить скрипт, что бы он работал, но тут я и сам понял в чем ошибка))

Так я уже говорил про глобальную цель - намного удобнее редактировать все в одном файле, особенно если в каждом текстовике по одному предложению, а их огромное кол-во.

Отправлено: 11:06, 29-07-2017 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Соединить несколько текстовых файлов в один

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
PowerShell - [решено] Обработка текстовых файлов и вывод всех значение в один файл Snap_Naprolom Скриптовые языки администрирования Windows 2 24-03-2016 15:44
2007 - [решено] Ошибка при установке - не удаётся обновить один или несколько защищённых файлов Golybec Microsoft Office (Word, Excel, Outlook и т.д.) 11 05-01-2016 18:28
[решено] Как автоматически один за другим воспроизвести несколько файлов в VLC на андроиде Yewgeniy Хочу все знать 2 06-05-2015 12:08
Службы - [решено] Параметры безопасности интернета не позволили открыть один или несколько файлов dd300 Microsoft Windows 8 и 8.1 5 17-02-2013 19:42
Как соединить несколько подсетей??? Guest Сетевые технологии 1 29-09-2004 09:41




 
Переход