Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.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 对于批处理文件,如何仅使用.txt文件中的令牌30-43?_Batch File_Token - Fatal编程技术网

Batch file 对于批处理文件,如何仅使用.txt文件中的令牌30-43?

Batch file 对于批处理文件,如何仅使用.txt文件中的令牌30-43?,batch-file,token,Batch File,Token,我正在使用批处理文件格式化文本文件,以便每小时自动将其附加到已填充的.csv文件中。我的问题是,文本文件的预期格式没有显示在记事本中。它以包含43个令牌的单行形式打开。我只需要30-43的代币。既然我不能跳过行,而且我超过了令牌限制,我有什么选择 您不需要说明您的标记分隔符是什么,或者您的任何值是否包含带引号的分隔符,或者任何标记是否为空(连续分隔符之间没有任何内容) 纯批量解决方案 我将假定您的输入是逗号分隔的。更改为/F使用的分隔符非常简单 我还将假设没有值包含逗号文字,并且没有连续的逗号。

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

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

纯批量解决方案

我将假定您的输入是逗号分隔的。更改
为/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
我没有将操作和写入操作放在循环中,因为您声明您的输入只有一行

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

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

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

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

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

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

您最好的选择是不要使用批处理。有很多更好的选择,Powershell?Python?批处理不适用于复杂的处理。混合解决方案或powershell会更好。请使用mark dbenham的答案作为您问题的答案。在最后一行的第二行中缺少一个感叹号。@LotPings-谢谢,所有问题都解决了,有一个漂亮的解决方案在等着我!非常感谢!您的一行代码可以完美地工作。在您的代码之后,我添加了JREPL,将双逗号“,”替换为单逗号“,”,现在一切都好了。