使用批处理文件,我如何才能从.txt文件中使用标记30-43?

时间:2017-03-02 01:28:56

标签: batch-file token

我正在使用批处理文件格式化文本文件,以便我可以每小时自动将其附加到已填充的.csv文件中。我的问题是,文本文件的预期格式没有显示在记事本中。它以43个令牌的单行打开。我只需要令牌30-43。因为我不能跳过线路而且我超过了令牌限制,我有什么选择?

1 个答案:

答案 0 :(得分:3)

您没有说明您的令牌分隔符是什么,或者您的任何值是否包含带引号的分隔符,或者任何令牌是否为空(连续分隔符之间没有任何内容)。

纯批次解决方案

我将假设您的输入是逗号分隔的。更改FOR /F使用的分隔符非常简单。

我还假设没有包含逗号文字的值,并且没有连续的逗号。一个简单的FOR /F无法处理任何一种情况。两者都可以通过批量解决(假设线条<8kb),但有点痛苦。如果你有这些问题,那么我认为你最好使用其他语言而不是批处理。

单个FOR /F命令无法解析超过31个令牌。有关详细信息,请参阅

但是你不需要解析过去29岁的任何令牌: - )

您只需将FOR /F"delims=29*"一起使用,*“令牌”将包含代币30-43。

for /f "usebackq tokens=29* delims=," %%A in ("yourInputFile.ext") do (echo(%%B) >>yourOutput.csv

如果输入分隔符不是逗号,则可以将变量30-43存储在变量中,然后使用find / replace替换管道中的逗号。

例如,如果您的输入参数是管道,那么

@echo off
setlocal
for /f "usebackq tokens=29* delims=|" %%A in ("yourInputFile.ext") do set "line=%%B"
setlocal enableDelayedExpansion
if defined line set "line=!line:|=,!"
(echo(!line!) >>yourOutput.csv

我没有在循环中放置操作和写操作,因为你声明你的输入只有一行。

我不会在循环完成之前启用延迟扩展,以防您的输入包含!文字。如果启用延迟扩展,FOR /F变量的扩展将损坏!值。

强大的JREPL.BAT解决方案(混合批处理/ JScript)

如果您的输入违反了我在纯批处理解决方案中列出的任何限制,那么您可以使用JREPL.BAT - A regular expression command line text processing utility。 JREPL.BAT是纯脚本(混合批处理/ JScript),可以在任何Windows机器上从XP开始本地运行 - 不需要第三方exe文件。

由于您没有指定输入格式,我将假设它是CSV。以下解决方案将简单地删除前29个令牌。它支持空标记,以及带逗号文字的引用标记。

call jrepl "^(\q([^\q]|\q\q)*\q,|[^,]*,){29}" "" /x /f yourFile.ext >>yourOutput.csv

如果您的输入不是csv格式,我确信有一个高效的JREPL解决方案。但我不会浪费时间来猜测你的格式。