0

我有一个我们将调用 info.txt 的文本文件,该文本文件包含许多长行,每行都有许多标签,如下所示:

A bunch of usless info {tag15}data data{Tag1}data {Tag2}data {Tag11}data {Tag1}data {Tag2}

因此,在本文档中,我需要找到 {Tag15} 并提取 {Tag15} 和 {Tag11} 之间的所有内容,或者它可能是另一个 {Tag15} 并将该数据段放入一个新的文本文件中。这样我就有了一个 15.txt 和一个 11.txt ,其中包含正确的数据段,包括它和下一个 Tag 字符串之间的所有标签。所以在这个例子中 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 

11.txt 将包含:

{Tag11}data {Tag1}data {Tag2}data data data {Tag3}data
{Tag11}data {Tag1}data {Tag2}data
{Tag11}data {Tag1}data {Tag2}data data

话虽这么说,我能看到的最合乎逻辑的方法是找到所有 Tag15 和 Tag11 并将它们移动到新行,这样我们就不必确定数据集有多长,因为它可以非常适合每个标签集. 然后通过另一个 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 并将它们移动到自己的行,这样文件看起来像这样:

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 文件,还是我错过了什么?如前所述,我最大的问题是我不确定如何将文件从其原始状态获取到上面的示例,以便可以对其进行排序,而无需知道我们尝试提取的字符串的确切长度。我希望这有帮助

4

2 回答 2

0

repl.bat这使用从 - http://www.dostips.com/forum/viewtopic.php?f=3&t=3855调用的帮助程序批处理文件

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

在您的文件样本上尝试此命令 -因为您的标签iix大小写不同,所以它不区分大小写。

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

任务仍然很混乱/不清楚。

于 2013-10-09T17:21:55.737 回答
0

所以我最终使用了一个我更熟悉的工具,并为 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%

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

于 2013-10-10T14:32:01.087 回答