Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 批处理脚本,在文本文件中查找字符串,并将其拆分为多个输出文件_Batch File - Fatal编程技术网

Batch file 批处理脚本,在文本文件中查找字符串,并将其拆分为多个输出文件

Batch file 批处理脚本,在文本文件中查找字符串,并将其拆分为多个输出文件,batch-file,Batch File,我有一个文本文件,我们称之为info.txt,该文本文件包含许多长行,每行中都有许多标记,如下所示: A bunch of usless info {tag15}data data{Tag1}data {Tag2}data {Tag11}data {Tag1}data {Tag2} FirstLast 55555555 10092013 0000000 {tag15}data data{Tag1}data {Tag2}data data {tag15}data data{Tag1}data

我有一个文本文件,我们称之为info.txt,该文本文件包含许多长行,每行中都有许多标记,如下所示:

A bunch of usless info {tag15}data data{Tag1}data {Tag2}data {Tag11}data {Tag1}data {Tag2}
FirstLast 55555555 10092013 0000000 
{tag15}data data{Tag1}data {Tag2}data data 
{tag15}data data{Tag1}data {Tag2}data data data data {Tag3}data 
{Tag11}data {Tag1}data {Tag2}data data data {Tag3}data
FirstLast 444444444 10092013 000000005 
{Tag11}data {Tag1}data {Tag2}data 
{tag15}data data{Tag1}data {Tag2}data 
{Tag11}data {Tag1}data {Tag2}data data
因此,在这个文档中,我需要定位{Tag15},并在{Tag15}和{Tag11}之间提取所有内容,或者它可以是另一个{Tag15},并将该数据段放入一个新的文本文件中。因此,我有一个15.txt和一个11.txt,其中包含正确的数据段,包括它和下一个标记字符串之间的所有标记。因此,在本例中,15.txt将包含:

{tag15}data data{Tag1}data {Tag2}data data
{tag15}data data{Tag1}data {Tag2}data data data data {Tag3}data 
{tag15}data data{Tag1}data {Tag2}data 
{Tag11}data {Tag1}data {Tag2}data data data {Tag3}data
{Tag11}data {Tag1}data {Tag2}data
{Tag11}data {Tag1}data {Tag2}data data
和11.txt将包含:

{tag15}data data{Tag1}data {Tag2}data data
{tag15}data data{Tag1}data {Tag2}data data data data {Tag3}data 
{tag15}data data{Tag1}data {Tag2}data 
{Tag11}data {Tag1}data {Tag2}data data data {Tag3}data
{Tag11}data {Tag1}data {Tag2}data
{Tag11}data {Tag1}data {Tag2}data data
也就是说,我能看到的最合乎逻辑的方法是找到所有的标记15和标记11,并将它们移动到一个新行,这样我们就不必确定数据集的长度,因为它可以非常适合每个标记集。然后通过另一个findstr处理该文件,并将每个匹配行拉出到相应的文件中。我不知道如何做的是在找到{tag15}或{tag11}的行的确切点插入一条新行。有什么想法吗

总的来说,文本文件将包含大约200-300个这些标记集,这些标记集需要被解析并排序为适当的txt文件。提前感谢您提供的任何帮助

我对其他解决方案持开放态度,而不仅仅是批处理,这恰好是我最满意的解决方案

编辑:

我可以理解为什么这里需要更多的信息,并为没有提供它开始道歉。因此,源文件每一行中的标记段总是以{tag15}或{tag11}开头,但该段中后面的标记可能会根据所推送的数据而有所不同,例如,如果Tag2中填充了Y,则需要Tag3,但如果Tag2为N,则Tag3将不存在于该段中,但tag5、6或200可能存在。这就是为什么我觉得最好定位Tag15或11并将其移动到自己的行,这样您就不必依赖于试图确定要移动的字符串的长度。示例15.txt和11.txt旨在说明由于每个段的数据不同,它可能会是什么样子,但下面是生成这些数据的源文件的样子:

Line1: FirstLast 55555555 10092013 0000000 {tag15}data data{Tag1}data {Tag2}data data {tag15}data data{Tag1}data {Tag2}data data data data {Tag3}data {Tag11}data {Tag1}data {Tag2}data data data {Tag3}data
Line2: FirstLast 444444444 10092013 000000005 {Tag11}data {Tag1}data {Tag2}data {tag15}data data{Tag1}data {Tag2}data {Tag11}data {Tag1}data {Tag2}data data
我的想法是,你把这个包含所有数据的文件,找到Tag15和Tag11,并将它们移到自己的行中,这样文件看起来像这样:

A bunch of usless info {tag15}data data{Tag1}data {Tag2}data {Tag11}data {Tag1}data {Tag2}
FirstLast 55555555 10092013 0000000 
{tag15}data data{Tag1}data {Tag2}data data 
{tag15}data data{Tag1}data {Tag2}data data data data {Tag3}data 
{Tag11}data {Tag1}data {Tag2}data data data {Tag3}data
FirstLast 444444444 10092013 000000005 
{Tag11}data {Tag1}data {Tag2}data 
{tag15}data data{Tag1}data {Tag2}data 
{Tag11}data {Tag1}data {Tag2}data data

既然每一行都是它自己的段,我们只需使用Findstr运行一个For循环,并将这些行回送到正确的txt文件,还是我遗漏了什么?如前所述,我最大的问题是我不确定如何将文件从其原始状态获取到上面的示例中,以便在不需要知道我们试图提取的字符串的确切长度的情况下对其进行排序。我希望这有帮助

这使用了一个名为
repl.bat的助手批处理文件
,来自-

repl.bat
与批处理文件和文本文件放在同一文件夹中

在您的文件样本上尝试此命令-
ix
中的
i
使其不区分大小写,因为您的标记是不同大小写的

type file.txt |repl "{tag15}" "\r\n{tag15}" ix |repl "{tag11}" "\r\n{tag11}" ix >newfile.txt

任务仍然非常混乱/不清楚。

因此我最终使用了一个我比较熟悉的工具,并安装了适用于windows的Sed。我从使用AWK的建议中得到了这个想法。因为这个脚本只在一个地方运行,所以我决定安装非本机工具不是问题。下面是我解决这个问题的方法:

Set sed=(the path to sed.exe for windows)
set filedir=Dir the source file is in
set file=name of source file
set wout=tag15.txt 
set win=tag11.txt

:: Locate "FTI0811 " which occurs prior to every {Tag15} tag and call a new line
%sed% -i -c --expression="s/FTI0811 /&\n/g" %filedir%%file%
:: Locate XFT811  which occurs prior to every {Tag11} tag and call a new line
%sed% -i -c --expression="s/XFT811 /&\n/g" %filedir%%file%
:: Find all strings that start with {Tag15} and echo them out to the Wires Out file variable
findstr "{tag15}" %filedir%%file% >> %wout%
:: Find all strings that start with {tag11} and echo them out to the Wires In file variable
findstr "{tag11}" %filedir%%file% >> %win%

谢谢大家的帮助和想法。请随意编辑/评论我的方法,我总是非常乐意得到反馈。很抱歉,这个问题对一些人来说有点模糊,由于我的工作原因,我无法发布整个源文件及其包含的内容。再次感谢

请更好地描述您正在提取的内容以及您在目标文件中想要的内容。您在源文件中显示了一行,在目标文件中显示了三行。请清楚地显示输入和输出。我同意foxidrive。我无法理解你怎么能从你发布的一行输入中逻辑地得到你的15.txt和11.txt输出。没有模式。示例:那
{Tag3}
呢?或者
{tag15}data{Tag1}data{Tag2}data
中的最后一个
数据
在哪里?需要更多的解释。这听起来像是
awk
的任务,我希望我添加的细节能有所帮助。如果你需要进一步解释,请告诉我。我认为,因为我不得不更改标记名,并且由于数据的敏感性质,我无法提供准确的数据示例,因此我可能一开始就过度简化了我的示例。每个标记段可包含数千个字符,每个标记15和标记11之间最多可包含40个不同的标记。