2017-01-17 5 views
0

Мне нужен способ разбиения файлов на несколько (или даже половину) на основе KB, а не на количество строк.Использование пакетных файлов Windows для разбиения больших «обернутых» файлов

Я старший аналитик EDI, и обернутые данные имеют тенденцию отображаться как одна длинная линия. Каждое «решение», которое я нахожу, разбивается на количество строк. Мне нужно что-то, что будет разделено по размеру.

Конечная цель состоит в том, чтобы «развязать» эти данные, что означает, что каждый сегмент будет в отдельной строке. Для этого мне нужно изменить разделители (поскольку в качестве разделителей есть специальные символы).

У меня есть решение для этого (см. Ниже), но по некоторым причинам это не будет работать с файлами размером более 10 КБ. Если вы знаете что-нибудь об EDI, это не очень большой.

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

Есть ли у кого-нибудь представление о том, как я могу выполнить это с помощью одной огромной линии?

(К сожалению, я должен удалить код я поместил здесь только в качестве примера, потому что кто-то попадет в это как дубликат, не читая. Пожалуйста, читайте выше и советуют.)

+0

Действительно ли PowerShell для вас, а не для пакета cmd? – Crypt32

+1

проверить это - http://stackoverflow.com/questions/28244063/how-can-i-split-a-binary-file-into-chunks-with-certain-size-with-batch-script-wi – npocmaka

+0

I ' ve фактически никогда не использовал PowerShell. Я нахожусь на Windows 7 Enterprise. Если я могу назвать это из пакетного файла, я в порядке. Пожалуйста, порекомендуйте. – user7431880

ответ

0

Хотя ваше описание обширно, Есть несколько которые не ясны. Слишком много несвязанных деталей, которые просто отклоняются от основной точки проблемы. Если каждый сегмент в строке разделен разделителем | (вы не объяснили это, но это предполагается из кода примера), и вы хотите разбить файл на основе определенного размера KB (вы не указали, сколько KB), то сегмент может быть разделен на два разных файла. Кроме того, я не понимаю, как изменение разделителей | звездочками может помочь решить проблему. После того, как прочитал этот вопрос несколько раз, я считать, что проблема заключается в следующем:

«Разделить файл, который просто содержит очень длинную строку (с не одной парой CR + LF) на сегменты, разграниченных |, поэтому каждый сегмент будет на собственной линии ».

Пакетный файл ниже является решением для это проблема:

@echo off 
setlocal EnableDelayedExpansion 

call :ProcessFile <input.txt> output.txt 
goto :EOF 


:ProcessFile 
set "previous=" 

:nextChunk 
rem Read the next 1023-bytes chunk 
set /P "chunk=" 
if errorlevel 1 goto endOfFile 

rem Break segment if previous one ends at a chunk limit 
if "!chunk:~0,1!" equ "|" if defined previous (
    echo !previous! 
    set "previous=" 
) 

rem Extract each segment from the chunk and place it on its own line 
set "last=" 
for /F "delims=" %%a in (^"!chunk:^|^=^ 
% This line separate segments by the given delimiter % 
!^") do (

    if defined last echo !last! 
    set "last=!previous!%%a" 
    set "previous=" 

) 
set "previous=!last!" 
goto nextChunk 

:endOfFile 
rem Show the last segment 
if defined previous echo !previous! 

exit /B 

EDIT: раствор JScript добавил

Как уже упоминалось, вы может также использовать решение на основе JScript, это стандартный язык программирования, предустановленный во всех версиях Windows с XP. Таким образом, решение очень просто, потому что вам просто нужно вставить следующие две строки в пакетном файле:

echo WScript.Stdout.Write(WScript.Stdin.ReadAll().replace(/\^|/g,"\r\n")) > replace.js 
cscript //nologo replace.js <input.txt> output.txt 

Это очень простой, но мощный метод, который вы можете использовать в других аналогичных заменить операции ; просто прочитайте соответствующий documentation.

+0

1) Я извиняюсь за недостаток ясности. Я новичок в группе, но это не оправдание. Теперь я вижу, как я это не понял. 2) Этот код отличный. Я собираюсь поиграть с ним, чтобы посмотреть, что я могу сделать. Большое вам спасибо за то, что нашли время! – user7431880

0

Причина, по которой вы не можете обрабатывать файлы> 10k байт, состоит в том, что пакетные переменные (и командные строки) ограничены ~ 8191 байт.

Вы атакуете проблему неэффективно. Вместо того, чтобы искать способ разделить файл на куски, чтобы вы могли использовать медленное пакетное решение, вы должны искать инструмент, который позволяет вам работать с большими файлами напрямую, не прибегая к разделению, обработке и Повторная сборка.

Как утверждают другие, PowerShell, JavaScript и VBS - это все хорошие языки сценариев, которые могут решить вашу проблему, и они являются родными для Windows.

Если ваши файлы имеют длину менее 1 гигабайта, то я предлагаю вам попробовать JREPL.BAT - a regex text processing utility. Это чистый скрипт (гибридный пакет/JScript), который запускается изначально на любом компьютере Windows с XP и дальше - не требуется сторонний файл exe. Полная документация доступна в командной строке через jrepl /?, или jrepl /?? для получения справки.

разворачивать файл, перевод | в *\r\n (\ г возврат каретки, а \ на новой строки):

jrepl "|" "*\r\n" /l /m /x /f "wrappedFileName" /o "unwrappedFileName" 

Для того, чтобы обернуть файл (обратный процесс)

jrepl "*\r\n" "|" /l /m /x /f "unwrappedFileName" /o "wrappedFileName" 

Если вы добавляете любую команду в пакетный скрипт, тогда вы должны использовать call jrepl вместо jrepl. Это связано с тем, что JREPL также является пакетным скриптом, поэтому управление не будет возвращаться к вашему скрипту, если вы не используете CALL.

+0

Действительно отличный ответ, спасибо и очень тщательно. Это эффективно разворачивало мой файл и оставляло (легко удаляемую) звездочку в конце каждой строки. Отлично. Большое вам спасибо за помощь. Я не знал о JREPL (я только вчера присоединился к группе). Спасибо! – user7431880

+0

И я вижу после запуска этого, что звездочка существует из-за моего собственного отсутствия ясности в вопросе выше. Несмотря на это, я получил его, чтобы работать благодаря вам. – user7431880

Смежные вопросы