2017-01-17 11 views
0

ファイルを、行数ではなくKBに基づいて複数(または半分)に分割する方法が必要です。Windowsバッチファイルを使用して大きな「ラップされた」ファイルを分割する

私はシニアEDIアナリストであり、ラップされたデータは1つの長い行として表示される傾向があります。私が見つけたすべての "解決策"は、行数に基づいて分割されます。私はサイズに基づいて分割するものが必要です。

最終目標は、このデータを「アンラップ」することです。つまり、各セグメントはそれぞれの行に表示されます。これを行うには、デリミタを変更する必要があります(デリミタとして「特殊文字」があるため)。

私は解決策がありますが(下記参照)、何らかの理由でこれが10 KBを超えるファイルでは機能しません。あなたがEDIについて何か知っていれば、それほど大きくない。

ファイルをそれぞれ約5KBの小さなファイルに分割するソリューションを見つける必要があります(文字列置換を使用して、それらを再結合することができます)。

誰もが私は1つ、巨大なラインでこれを達成するかもしれない方法のアイデアを持っていますか?

(申し訳ありませんが、私は誰かが上記の読みと助言してください。ITを読まず、重複としてこれをフラグが立てられているので、私は一例としてここに置かコードを削除する必要があります。)

+0

cmdのバッチではなく、PowerShellを使用できますか? – 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

私は、実際にPowerShellを使用したことはありません。 私はWindows 7 Enterpriseにいます。 バッチファイルから呼び出せればいいです。お知らせ下さい。 – user7431880

答えて

0

あなたの説明は広範ですが、複数があります明確でない点。問題の中核点から逸脱した無関係の詳細はあまりにも多くあります。行の各セグメントが区切り文字で区切られている場合(この点については説明していませんが、例のコードでは仮定しています)、特定のKBサイズに基づいてファイルを分割したい場合(指定しなかった場合は、 )、セグメントは2つの異なるファイルに分割されることがあります。また、アスタリスクで区切り文字を|に変更すると、問題を解決するのに役立つかもしれません。

「だけで区切られたセグメントに(ない単一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に基づくソリューションを使用することもできますが、これは、XPからのすべてのWindowsバージョンにプリインストールされている標準のプログラミング言語です。あなたは自分のバッチファイルに次の2行を挿入する必要があるため、この方法では、溶液は、本当に簡単です:

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

バッチ変数(およびコマンドライン)が〜8191バイトに制限されているため、ファイル> 10KBを処理できない理由があります。

あなたは非効率的な方法で問題を攻撃しています。ゆっくりとしたバッチの「ソリューション」を使用できるように、ファイルを複数の塊に分割する方法を検討するのではなく、分割、処理、および処理に頼らずに大規模なファイルを直接操作できるツールを探してください。再組み立て。

PowerShell、JavaScript、およびVBSはすべて、問題を解決できる優れたスクリプト言語であり、Windows固有のものです。

ファイルのサイズがすべて1ギガバイト未満の場合は、JREPL.BAT - a regex text processing utilityをお試しください。これは、XP以降の任意のWindowsマシンでネイティブに実行される純粋なスクリプト(ハイブリッドバッチ/ JScript)です。サードパーティのexeファイルは必要ありません。完全なドキュメントはコマンドラインからjrepl /?、またはjrepl /??を使用してページングされたヘルプをご覧ください。

*\r\n|を翻訳、ファイルのラップを解除する(\ rはキャリッジリターンであり、改行ナ\):

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

ファイルをラップする(工程を逆)

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

場合いずれかのコマンドをバッチスクリプト内に置くと、jreplの代わりにcall jreplを使用する必要があります。これは、JREPLもバッチスクリプトであるため、CALLを使用しない限り、制御はスクリプトに戻りません。

+0

本当に素晴らしい答え、非常に徹底していただきありがとうございます。これは効率的にファイルを展開し、各行の最後にアスタリスク(簡単に削除)を残しました。これは素晴らしい。助けてくれてありがとう。 私はJREPLを知らなかった(私は実際にグループに昨日参加した)。ありがとうございました! – user7431880

+0

これを実行した後、上記の質問に私自身の明快さがないためアスタリスクがあることがわかります。 それにかかわらず、私はあなたのおかげでそれを働かせました。 – user7431880

関連する問題