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

uraabk 28-07-2017 17:38 2754656

Соединить несколько текстовых файлов в один
 
Привет форумчане.
Нужен 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.


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

Iska 28-07-2017 17:52 2754659

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

Цитата:

Цитата uraabk
У меня файлы в кодировке UCS-2 LE BOM »

Пакетные файлы не особо гожи для этого. WSH/PoSH.

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

uraabk 28-07-2017 18:09 2754660

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

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

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

Цитата:

Цитата Iska
Пакетные файлы не особо гожи для этого. WSH/PoSH.

Я не силен в этом) Если подскажите более удобный способ, буду только рад.

Iska 28-07-2017 18:22 2754664

Цитата:

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

Я не могу с Вами согласиться. Что за работа?

Цитата:

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

Резервирование, резервирование и ещё раз резервирование.

Цитата:

Цитата uraabk
Я не силен в этом) Если подскажите более удобный способ, буду только рад. »

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

uraabk 28-07-2017 18:31 2754665

Цитата:

Цитата Iska
Что за работа? »

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

Цитата:

Цитата Iska
Резервирование, резервирование и ещё раз резервирование. »

В данном случае резервирование будет в файле outfile.txt

Цитата:

Цитата Iska
Упакуйте несколько таких файлов »

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

Iska 28-07-2017 19:18 2754673

Цитата:

Цитата uraabk
А какое отношение это имеет к данной проблеме? »

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

Цитата:

Цитата uraabk
Я прошу доработать уже созданный bat или подсказать что поудобнее. »

Вот ровно для того же меня интересует озвученное мною. Чтобы доработать или что-то вменяемое подсказать.

Цитата:

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

Это неудачный выбор.


Цитата:

Цитата uraabk
А в файлах что вы не видели? »

Содержимого.


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

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

Busla 28-07-2017 20:31 2754686

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

uraabk 28-07-2017 20:40 2754688

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

Iska 29-07-2017 05:18 2754726

Цитата:

Цитата 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», целевым каталогом по умолчанию — текущий каталог (могут быть переопределены заданием параметров при вызове скрипта).

uraabk 29-07-2017 11:06 2754751

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

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

Iska 29-07-2017 20:01 2754797

Цитата:

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

Почему удобнее в одном? Вот это так и осталось для меня непонятным. Если будет желание — можете пояснить на примере.

uraabk 29-07-2017 21:04 2754809

Цитата:

Цитата Iska
Почему удобнее в одном? Вот это так и осталось для меня непонятным. Если будет желание — можете пояснить на примере. »

Представьте 10 папок. В каждой из 10 папок есть по 5 папок. В каждой из пяти папок существует от 1-3 папки в которых имеется от 1 до 6 файлов. В которых по паре слов или предложений

Конкретно вас не замучает бегать по папкам взад вперед, не запутаетесь? А так все в одном листе. Листай, ищи через поиск нужную фразу и т.д.)

Iska 29-07-2017 21:59 2754810

Цитата:

Цитата uraabk
Конкретно вас не замучает бегать по папкам взад вперед, не запутаетесь? »

Нет, не запутаюсь — я пользую Far Manager :).

Кроме того, есть такое понятие, как проект/сессия. Выбираете подходящий редактор, открываете в нём файлы во вкладках, сохраняете сессию или как проект. В последующем достаточно просто открыть эту сохранённую сессию или проект одним движением.

Далее. Для поиска (и замены) внутри множества файлов также есть немало решений без необходимости слияния их в один файл.

Цитата:

Цитата uraabk
Листай, ищи через поиск нужную фразу и т.д.) »

Вот я как раз хотел бы понять — что именно Вы делаете с этим одним файлом. Конкретно. Может быть, действительно, иначе никак. Но пока я этого не вижу.


Время: 09:11.

Время: 09:11.
© OSzone.net 2001-