使用Windows批处理文件分割大型" Wrapped"档

时间:2017-01-17 18:50:25

标签: string file batch-file split edi

我需要一种方法,根据KB而不是行数将文件拆分成多个(甚至一半)。

我是高级EDI分析师,包装数据往往显示为一条长线。每个"解决方案"我根据行数找到分裂。我需要根据尺寸分割的东西。

最终目标是" Unwrap"这个数据,意味着每个细分都将在自己的行上。要做到这一点,我需要更改分隔符(因为有"特殊字符"作为分隔符)。

我确实有一个解决方案(见下文),但由于某种原因,这不适用于大于10 KB的文件。如果你对EDI有所了解,那就不是很大了。

我需要找到一个解决方案,将文件拆分成每个大约5KB的较小文件(然后我可以使用字符串替换并自己重新组合)。

有没有人知道如何通过一条巨大的线来实现这一目标?

(对不起,我必须删除我放在这里的代码仅作为示例,因为有人将此标记为重复但没有阅读。请在上面阅读并提供建议。)

2 个答案:

答案 0 :(得分:0)

虽然您的描述很广泛,但有几点尚不清楚。有太多不相关的细节只是偏离了问题的核心点。如果行中的每个段由Function getlabel(ByVal day As DayOfWeek, ByVal row As Integer) As Label Dim result As Label = Nothing Select Case day Case DayOfWeek.Sunday Select Case row Case 1 result = su1 Case 2 result = su2 Case 3 result = su3 Case 4 result = su4 Case 5 result = su5 Case 6 result = su6 End Select 'continue your cases. End Select Return result End Function 分隔符分隔(您没有解释这一点,但是从示例代码中假设它)并且您希望根据特定的KB大小拆分文件(您没有指定了多少KB),然后一个段可以分成两个不同的文件。另外,我不明白如何用星号更改|分隔符可能有助于解决问题。在多次阅读此问题后,我认为问题是这样的:

  
    

“将包含很长行(没有单个CR + LF对)的文件拆分为由|字符分隔的段,因此每个段都将在其自己的行上。”

  

下面的批处理文件是问题的解决方案:

|

编辑添加了JScript解决方案

正如其他人所提到的,您也可以使用基于JScript的解决方案,这是一种预装在XP上所有Windows版本中的标准编程语言。这样,解决方案非常简单,因为您只需要在批处理文件中插入以下两行:

@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

这是一种非常简单但功能强大的方法,您可以在其他类似的替换操作中使用它;只需阅读相应的documentation

答案 1 :(得分:0)

您无法处理文件的原因&gt; 10k字节是因为批处理变量(和命令行)限制为~8191字节。

您正在以低效的方式攻击问题。而不是寻找一种方法将文件拆分成块以便您可以使用慢速批处理“解决方案”,而应该寻找一种工具,允许您直接使用大型文件,而无需分离,处理和重新组装。

正如其他人所说,PowerShell,JavaScript和VBS都是可以解决问题的优秀脚本语言,而且它们是Windows的原生语言。

如果您的文件长度都小于1千兆字节,那么我建议您尝试JREPL.BAT - a regex text processing utility。它是纯脚本(混合批处理/ JScript),可以在任何Windows机器上从XP开始本地运行 - 不需要第三方exe文件。可以从命令行通过jrepl /?jrepl /??获取完整文档以获取分页帮助。

要解包文件,将|翻译成*\r\n(\ 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,否则控件不会返回到您的脚本。