String 使用Windows批处理文件拆分大“文件”;包装的;文件夹

String 使用Windows批处理文件拆分大“文件”;包装的;文件夹,string,file,batch-file,split,edi,String,File,Batch File,Split,Edi,我需要一种方法来分割成多个文件(甚至一半)的基础上KB,而不是行数 我是一名高级EDI分析师,包装的数据往往显示为一条长线。我找到的每个“解决方案”都是基于行数的拆分。我需要一些可以根据大小进行分割的东西 最终目标是“展开”这些数据,这意味着每个数据段都在自己的线上。为此,我需要更改分隔符(因为有“特殊字符”作为分隔符) 我确实有一个解决方案(见下文),但由于某些原因,这对大于10KB的文件不起作用。如果你知道EDI,那不是很大 我需要找到一个解决方案,将文件拆分为每个约5KB的较小文件(然后我

我需要一种方法来分割成多个文件(甚至一半)的基础上KB,而不是行数

我是一名高级EDI分析师,包装的数据往往显示为一条长线。我找到的每个“解决方案”都是基于行数的拆分。我需要一些可以根据大小进行分割的东西

最终目标是“展开”这些数据,这意味着每个数据段都在自己的线上。为此,我需要更改分隔符(因为有“特殊字符”作为分隔符)

我确实有一个解决方案(见下文),但由于某些原因,这对大于10KB的文件不起作用。如果你知道EDI,那不是很大

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

有没有人知道我如何用一条巨大的线来完成这个任务


(很抱歉,我必须删除我放在这里的代码,只是作为示例,因为有人未阅读就将其标记为重复代码。请阅读上面的内容并提出建议。)

尽管您的描述很详细,但仍有许多地方不清楚。有太多不相关的细节偏离了问题的核心。如果行中的每个段都由一个
|
分隔符分隔(您没有解释这一点,但从示例代码中假设这一点),并且您希望根据特定的KB大小分割文件(您没有指定有多少KB),则可以将一个段分割为两个不同的文件。此外,我不明白用星号更改
|
分隔符如何有助于解决问题。在多次阅读该问题后,我认为问题在于:

“将只包含很长一行(没有一个CR+LF对)的文件拆分为由
|
字符分隔的段,以便每个段都位于自己的行上。”

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

@echo关闭
setlocal EnableDelayedExpansion
调用:ProcessFileoutput.txt
后藤:EOF
:ProcessFile
设置“上一个=”
:nextChunk
rem读取下一个1023字节的块
设置/P“块=”
如果错误级别1转到endOfFile
rem中断段(如果前一个段在块限制处结束)
如果“!chunk:~0,1!”eq“|”(
回声!上一个!
设置“上一个=”
)
rem从块中提取每个段并将其放在自己的行上
设置“last=”
对于/F“delims=“%%a in(^”!chunk:^|^=^
%该行按给定的分隔符%分隔段
!^“)做什么(
如果定义了最后一个回声!最后一个!
设置“last=!previous!%%a”
设置“上一个=”
)
设置“上一个=!上一个!”
转到下一步
:endofile
rem显示最后一段
如果定义了上一个echo!以前的
退出/B

编辑:添加了JScript解决方案

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

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

这是一种非常简单但功能强大的方法,可用于其他类似的替换操作;只需阅读相应的。

无法处理大于10k字节的文件的原因是批处理变量(和命令行)限制在~8191字节

你正在以一种低效的方式解决这个问题。与其寻找一种将文件分割成块的方法,以便使用慢速批处理“解决方案”,不如寻找一种允许您直接处理大文件的工具,而无需进行分割、处理和重新组装

正如其他人所说,PowerShell、JavaScript和VBS都是很好的脚本语言,可以解决您的问题,而且它们都是Windows的本机语言

如果你的文件长度都小于1GB,那么我建议你试试。它是纯脚本(混合批处理/JScript),从XP开始在任何Windows计算机上本机运行-不需要第三方exe文件。可通过命令行通过
jrepl/?
jrepl/??
获取完整文档,以获取分页帮助

要打开文件,请将
|
转换为
*\r\n
(\r是回车符,\n是换行符):

包装文件的步骤(反向处理)


如果将任一命令放入批处理脚本中,则必须使用
calljrepl
而不是
jrepl
。这是因为JREPL也是一个批处理脚本,所以除非您使用CALL,否则控制将不会返回到您的脚本。

PowerShell是否适合您而不是cmd batch?检查此项-我实际上从未使用过PowerShell。我使用的是Windows7企业版。如果我能从批处理文件中调用它,我就可以了。默认情况下,windows上可以使用Please advice.JavaScript,这比尝试让BAT脚本执行此操作要好得多。为什么这与您提出的不同问题的代码相同?JavaScript和Java根本不是同一种语言……非常好的回答,谢谢,非常彻底。这有效地打开了我的文件,并在每行末尾留下了一个星号(很容易删除)。这太棒了。非常感谢你的帮助。我不知道JREPL(实际上我昨天才加入这个小组)。非常感谢。在运行这个程序之后,我发现星号在那里,因为我自己在上面的问题中缺乏清晰性。不管怎样,多亏了你,我才得以成功。1)我为我的不清晰道歉。我是新来的,但这不是一个好借口。我现在明白了,我是多么不清楚这一点。2) 这段代码非常好。我要和它玩一玩,看看我能做些什么。非常感谢您抽出时间!
echo WScript.Stdout.Write(WScript.Stdin.ReadAll().replace(/\^|/g,"\r\n")) > replace.js
cscript //nologo replace.js  < input.txt  > output.txt
jrepl "|" "*\r\n" /l /m /x /f "wrappedFileName" /o "unwrappedFileName"
jrepl "*\r\n" "|" /l /m /x /f "unwrappedFileName" /o "wrappedFileName"