Windows批处理脚本解析CSV文件并输出文本文件

2023-11-24

我在另一个页面上看到了回复(帮助编写批处理脚本来解析 CSV 文件并输出文本文件) - 出色的代码顺便说一句:

@ECHO OFF
IF "%~1"=="" GOTO :EOF
SET "filename=%~1"
SET fcount=0
SET linenum=0
FOR /F "usebackq tokens=1-10 delims=," %%a IN ("%filename%") DO ^
CALL :process "%%a" "%%b" "%%c" "%%d" "%%e" "%%f" "%%g" "%%h" "%%i" "%%j"
GOTO :EOF

:trim
SET "tmp=%~1"
:trimlead
IF NOT "%tmp:~0,1%"==" " GOTO :EOF
SET "tmp=%tmp:~1%"
GOTO trimlead

:process
SET /A linenum+=1
IF "%linenum%"=="1" GOTO picknames

SET ind=0
:display
IF "%fcount%"=="%ind%" (ECHO.&GOTO :EOF)
SET /A ind+=1
CALL :trim %1
SETLOCAL ENABLEDELAYEDEXPANSION
ECHO !f%ind%!!tmp!
ENDLOCAL
SHIFT
GOTO display

:picknames
IF %1=="" GOTO :EOF
CALL :trim %1
SET /a fcount+=1
SET "f%fcount%=%tmp%"
SHIFT
GOTO picknames

它非常适合我以以下格式制作的示例 csv 文件:

Header,Name,Place
one,two,three
four,five,six

然而,我想要更改的实际文件包含 64 个字段 - 所以我更改了tokens=1-10 to tokens=1-64并增加了%%a等等最多 64 个变量(最后一个被调用%%BL例如)。然而现在,当我在“大”csv 文件(带有 64 个标记)上运行批处理时,什么也没有发生。没有错误(很好)但没有输出! (坏的)。如果有人能提供帮助,那就太棒了……如果我能把最后一点搞定的话,我就非常接近让整个应用程序正常工作了!或者,如果有人有一些示例代码,可以对无限数量的令牌执行类似的操作...最终我想创建一个类似于以下内容的字符串:

field7,field12,field15,field18

重要更新- 我认为 Windows 批处理不是满足您需求的好选择,因为单个 FOR /F 无法解析超过 31 个标记。请参阅下面附录底部的解释。

但是,可以通过批处理执行您想要的操作。这个丑陋的代码将使您能够访问所有 64 个令牌。

for /f "usebackq tokens=1-29* delims=," %%A in ("%filename%") do (
  for /f "tokens=1-26* delims=," %%a in ("%%^") do (
    for /f "tokens=1-9 delims=," %%1 in ("%%{") do (
      rem Tokens 1-26 are in variables %%A - %%Z
      rem Token  27 is in %%[
      rem Token  28 is in %%\
      rem Token  29 is in %%]
      rem Tokens 30-55 are in %%a - %%z
      rem Tokens 56-64 are in %%1 - %%9
    )
  )
)

附录提供了有关上述内容如何工作的重要信息。

如果您只需要在线上的 64 个标记中分布一些标记,那么解决方案会稍微容易一些,因为您可能能够避免使用疯狂的字符作为 FOR 变量。但仍然需要仔细记账。

例如,以下内容将允许您访问令牌 5、27、46 和 64

for /f "usebackq tokens=5,27,30* delims=," %%A in ("%filename%") do (
  for /f "tokens=16,30* delims=," %%E in ("%%D") do (
    for /f "tokens=4 delims=," %%H in ("%%G") do (
      rem Token  5 is in %%A
      rem Token 27 is in %%B
      rem Token 46 is in %%E
      rem Token 64 is in %%H
    )
  )
)

2016 年 4 月更新- 基于 DosTips 用户 Aacini、penpen 和 aGerman 的调查工作,我开发了一种相对简单的方法,可以使用 FOR /F 同时访问数千个令牌。该工作是一部分这个 DosTips 线程。实际代码可以在这 3 个帖子中找到:

  • 使用固定数量的列
  • 使用不同数量的列
  • 动态选择在 DO 子句中扩展哪些标记

原答案FOR 变量仅限于单个字符,因此您的 %%BL 策略不起作用。变量区分大小写。根据 Microsoft 的说法,您只能在一个 FOR 语句中捕获 26 个令牌,但如果您使用的不仅仅是 alpha,则可能会获得更多。这很痛苦,因为您需要一个 ASCII 表来确定哪些字符去哪里。然而,FOR 不允许任意字符,单个 FOR /F 可以分配的最大标记数为 31 +1。正如您所发现的,任何解析和分配超过 31 个的尝试都会悄悄失败。

值得庆幸的是,我认为您不需要那么多代币。您只需使用 TOKENS 选项指定所需的令牌即可。

for /f "usebackq tokens=7,12,15,18 delims=," %%A in ("%filename%") do echo %%A,%%B,%%C,%%D

会给你第 7 个、第 12 个、第 15 个和第 18 个令牌。

Addendum

2016 年 4 月更新 几周前,我了解到以下规则(6 年前编写)与代码页相关。以下数据已经过验证 代码页 437 和 850。 更重要的是,扩展 ASCII 字符 128-254 的 FOR 变量序列与字节代码值不匹配,并且因代码页而异。事实证明,FOR /F 变量映射基于底层 UTF-(16?) 代码点。因此,当与 FOR /F 一起使用时,扩展 ASCII 字符的用途有限。请参阅线程了解更多信息。

我进行了一些测试,并可以报告以下内容(根据jeb的评论更新):

大多数字符都可以用作 FOR 变量,包括扩展 ASCII 128-254。但有些字符不能在 FOR 语句的第一部分中用来定义变量,但可以在 DO 子句中使用。有几个也不能用。有些没有限制,但需要特殊语法。

以下是具有限制或需要特殊语法的字符的摘要。请注意,尖括号内的文本如<space>代表单个字符。

Dec  Hex   Character   Define     Access
  0  0x00  <nul>       No         No
 09  0x09  <tab>       No         %%^<tab>  or  "%%<tab>"
 10  0x0A  <LF>        No         %%^<CR><LF><CR><LF>  or  %%^<LF><LF>
 11  0x0B  <VT>        No         %%<VT>
 12  0x0C  <FF>        No         %%<FF>
 13  0x0D  <CR>        No         No
 26  0x1A  <SUB>       %%%VAR%    %%%VAR% (%VAR% must be defined as <SUB>)
 32  0x20  <space>     No         %%^<space>  or  "%%<space>"
 34  0x22  "           %%^"       %%"  or  %%^"
 36  0x24  $           %%$        %%$ works, but %%~$ does not
 37  0x25  %           %%%%       %%~%%
 38  0x26  &           %%^&       %%^&  or  "%%&"
 41  0x29  )           %%^)       %%^)  or  "%%)"
 44  0x2C  ,           No         %%^,  or  "%%,"
 59  0x3B  ;           No         %%^;  or  "%%;"
 60  0x3C  <           %%^<       %%^<  or  "%%<"
 61  0x3D  =           No         %%^=  or  "%%="
 62  0x3E  >           %%^>       %%^>  or  "%%>"
 94  0x5E  ^           %%^^       %%^^  or  "%%^"
124  0x7C  |           %%^|       %%^|  or  "%%|"
126  0x7E  ~           %%~        %%~~ (%%~ may crash CMD.EXE if at end of line)
255  0xFF  <NB space>  No         No

特殊字符如^ < > | &必须转义或引用。例如,以下作品:

for /f %%^< in ("OK") do echo "%%<" %%^<

某些字符不能用于定义 FOR 变量。例如,以下给出语法错误:

for /f %%^= in ("No can do") do echo anything

But %%=可以使用 TOKENS 选项隐式定义,并且在 DO 子句中访问的值如下所示:

for /f "tokens=1-3" %%^< in ("A B C") do echo %%^< %%^= %%^>

The %是奇数 - 您可以使用定义 FOR 变量%%%%。但是除非您使用该值,否则无法访问该值~修饰符。这意味着无法保留括起来的引号。

for /f "usebackq tokens=1,2" %%%% in ('"A"') do echo %%%% %%~%%

以上产量%% A

The ~是一个潜在危险的 FOR 变量。如果您尝试使用访问变量%%~在一行的末尾,您可能会得到不可预测的结果,甚至可能导致 CMD.EXE 崩溃!不受限制地访问它的唯一可靠方法是使用%%~~,这当然会删除所有包含的引号。

for /f %%~ in ("A") do echo This can crash because its the end of line: %%~

for /f %%~ in ("A") do echo But this (%%~) should be safe

for /f %%~ in ("A") do echo This works even at end of line: %%~~

The <SUB>(0x1A) 字符很特殊,因为<SUB>批处理脚本中嵌入的文字被读取为换行符 (<LF>)。为了使用<SUB>作为 FOR 变量,该值必须以某种方式存储在环境变量中,然后%%%VAR%将适用于定义和访问。

如前所述,单个 FOR /F 最多可以解析和分配 31 个标记。例如:

@echo off
setlocal enableDelayedExpansion
set "str="
for /l %%n in (1 1 35) do set "str=!str! %%n"
for /f "tokens=1-31" %%A in ("!str!") do echo A=%%A _=%%_

以上产量A=1 _=31 注意 - 标记 2-30 工作得很好,我只是想要一个小例子

如果不设置 ERRORLEVEL,任何解析和分配超过 31 个标记的尝试都会失败。

@echo off
setlocal enableDelayedExpansion
set "str="
for /l %%n in (1 1 35) do set "str=!str! %%n"
for /f "tokens=1-32" %%A in ("!str!") do echo this example fails entirely

您可以解析并分配最多 31 个令牌,并将剩余的令牌分配给另一个令牌,如下所示:

@echo off
setlocal enableDelayedExpansion
set "str="
for /l %%0 in (1 1 35) do set "str=!str! %%n"
for /f "tokens=1-31*" %%@ in ("!str!") do echo @=%%A  ^^=%%^^  _=%%_

以上产量@=1 ^=31 _=32 33 34 35

现在是真正的坏消息。正如我在查看时了解到的那样,单个 FOR /F 永远无法解析超过 31 个标记Windows 批处理脚本中 FOR 命令中的令牌数量限制

@echo off
setlocal enableDelayedExpansion
set "str="
for /l %%n in (1 1 35) do set "str=!str! %%n"
for /f "tokens=1,31,32" %%A in ("!str!") do echo A=%%A  B=%%B  C=%%C

非常不幸的输出是A=1 B=31 C=%C

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Windows批处理脚本解析CSV文件并输出文本文件 的相关文章

  • Windows 计算机上出现“来自守护程序的错误响应:无法创建填充程序:OCI 运行时创建失败”错误

    我正在尝试构建一个简单的 Python 映像 然后在 Windows 上以交互方式访问容器 构建过程有效 但运行容器失败 这是 Dockerfile FROM python 3 10 4 WORKDIR app 生成文件 IMAGE scr
  • Windows下Kafka托管在Docker中删除主题时出现异常

    我在 Windows 的 Docker 中托管 Kafka 威斯迈斯特 卡夫卡 https hub docker com r wurstmeister kafka 使用 docker 镜像 Kafka 数据存储在本地 Windows 文件夹
  • 避免 Inno Setup 中的“无法展开 shell 文件夹常量 userdocs”错误

    我将一些示例文档安装到 Windows 上标准 我的文档 文件夹的 PerfectTablePlan 子文件夹中 这对于 99 以上的用户来说效果很好 但是 如果用户没有 我的文档 文件夹 我会收到许多以下形式的丑陋错误消息 内部错误 无法
  • 如何在不超时的情况下解析大型 CSV 文件?

    我正在尝试解析 50 MB 的 csv 文件 文件本身很好 但我正在尝试解决所涉及的大量超时问题 每个设置上传明智 我可以轻松上传并重新打开文件 但浏览器超时后 我收到 500 内部错误 我的猜测是我可以将文件保存到服务器上 打开它并保留我
  • 如何在 T-SQL 中将 CSV 转换为记录集?

    在我的存储过程中 我传递一个过滤器 使用 WHERE Column IN 子句 作为参数 参数值以 CSV 形式给出 将此 CSV 转换为记录集的最佳方法是什么 例子 SELECT FROM Employee WHERE Name IN J
  • 使用脚本查找字符串长度的奇怪结果?

    我正在测试 unmeat 提交的这段代码这个问题 https stackoverflow com questions 21817684 batch get string length with special characters 肉叔叔引
  • 如何避免 pandas 在保存的 csv 中创建索引

    我试图在对文件进行一些编辑后将 csv 保存到文件夹中 每次我使用pd to csv C Path of file csv csv 文件有一个单独的索引列 我想避免将索引打印到 csv 我试过 pd read csv C Path to f
  • 排除批复制脚本中的文件夹

    我正在使用 U 盘上的批处理文件来备份我的照片 我使用以下命令 for r C x in jpg png gif do copy y x 我想排除邮件文件夹 WINDOWS 和 PROGRAM FILES 中的文件 有谁知道如何使用批处理文
  • 使用 IDLE 编辑的 .py 文件消失了

    我曾经有过Edit with IDLE当我右键单击时的选项 py文件 但我多次卸载 重新安装以使某些东西正常工作 但现在它消失了 我检查了注册表HKEY CLASSES ROOT and HKEY LOCAL MACHINE对于价值低于Py
  • Windows Workflow Foundation 4 (WF4) 延迟

    我正在与 Visual Studio 2010 的候选版本一起使用 Wf4 编写一个用于批准资源请求的新工作流程 在我的工作流程中 如果请求未获得批准 我希望请求在几天后过期 我们在 WF 3 5 Visual Studio 2008 中通
  • 在OpenCV中将YUV转换为BGR或RGB

    我有一个电视采集卡 其输入内容为 YUV 格式 我在这里看到了与此问题类似的其他帖子 并尝试尝试所述的所有可能的方法 但它们都没有提供清晰的图像 目前最好的结果是 OpenCVcvCvtColor scr dst CV YUV2BGR 函数
  • 以编程方式最小化/恢复窗口,跳过动画效果

    我需要对窗口列表执行多项操作 最小化其中一些 恢复其他 以便立即在两组或多组窗口之间切换 这样做的问题是最小化和恢复窗口时可以看到的动画 整个过程看起来很糟糕 所有这些动画都进进出出 上下移动 但是 我无法禁用这些动画 因为这是针对其他计算
  • 如何在 C++ 中急于提交分配的内存?

    总体情况 带宽 CPU 使用率和 GPU 使用率都极其密集的应用程序需要每秒从一个 GPU 向另一个 GPU 传输约 10 15GB 的数据 它使用 DX11 API 来访问 GPU 因此上传到 GPU 只能在每次上传都需要映射的缓冲区中进
  • 更改desktop.ini不会在Windows中自动更新文件夹图标

    我使用此批处理脚本将所有文件夹和子文件夹的图标更改为位于文件夹中的 ico 文件 但是 资源管理器中的文件夹图标不会改变除非我手动重命名desktop ini将资源管理器中的文件更改为其他内容 然后返回desktop ini或者例如将字母更
  • Windows 上的 Openssl 错误 0x02001005 和 0x2006D002?

    我正在尝试使用 openssl 将 cer 证书转换为 p12 证书 这是我正在使用的命令 C OpenSSL Win32 bin gt openssl x509 inform der in developer identity cer o
  • 从命令行运行 R 代码 (Windows)

    我在名为 analysis r 的文件中有一些 R 代码 我希望能够从命令行 CMD 运行该文件中的代码 而无需通过 R 终端 并且我还希望能够传递参数并在我的代码中使用这些参数 例如就像下面的伪代码 C gt execute r scri
  • 以编程方式从 java 代码中查找 java.exe 的绝对路径

    如果我有一个由用户启动的 java jar 或类文件 假设在环境变量中设置了 java 路径 那么我如何从代码中找出 java exe javaw exe 的绝对路径文件正在启动 就像在 ubuntu 上一样 我们可以运行 which ja
  • 如何在Windows上分离“Git bash”中启动的“git gui”?

    例如 我开始 git bash 我导航到某个目录 I start git gui 我关闭控制台窗口或按 Ctrl C Git gui 的窗口消失了 即使我用过git gui disown 即使当我按 Ctrl C 时它不在前台 如何正确分离
  • Kerberos 双跳

    我们遇到了臭名昭著的 Kerberos 双跳问题 这是一个全新的域 是从以前使用模拟和委派的另一个提供商迁移而来的 我们已将操作系统升级到最新的 SQL 服务器 2017 WPF 应用程序 使用域凭据 gt Web 服务 IIS 10 上的
  • 游戏内的java.awt.Robot?

    我正在尝试使用下面的代码来模拟击键 当我打开记事本时 它工作正常 但当我打开我想使用它的游戏时 它没有执行任何操作 所以按键似乎不起作用 我尝试模拟鼠标移动和点击 这些动作确实有效 有谁知道如何解决这个问题 我发现这个问题 如何在游戏中使用

随机推荐

  • Grails 2.3.0 未运行

    I have Grails 2 3 0 当我运行命令时run app我收到这条消息 gt Error Error executing script RunApp gt GrailsClasspath groovy run closure1
  • 在 Electron 应用程序上处理 Squirrel 的事件

    这些天我在玩弄Electron为 Windows 构建一个小型本机应用程序 我正在使用Grunt Electron 安装程序为我的应用程序创建安装程序 安装程序已成功创建 但我不知道如何在我的应用程序中处理 Squirrel 的事件 如文档
  • 如何列出 war 文件中 jar 文件的内容

    假设我有一个 war 文件 myWarFile war 该文件内部有一个 jar 文件 WEB INF myJarFile jar 我想在不解压 war 文件的情况下查看 myJarFile jar 中的文件是什么 有办法做到吗 jar x
  • OpenGL ES 2.0 中的浮点纹理

    我一直在试图弄清楚如何在 GLES2 中使用浮动纹理 API 参考说只能使用无符号字节和短裤 但我看到有人说其他地方支持它 我可以用GL LUMINANCE作为纹理格式 但这只能给我一个浮点值 在 OpenGL ES 2 0 中 仅当实现导
  • 如何生成String类型的buildConfigField

    In my Android Studio项目有两个build configuration和一些buildConfigField buildTypes def SERVER URL SERVER URL def APP VERSION APP
  • + 运算符是否对原始类型重载?

    已经重载的运算符 gt 等被多次使用 我想到的一个例子是当我们添加字符串时说 字符串名称 string munish kumar 运算符在字符串类中被重载 但是当我们添加像 1 2 这样的数字时 看起来不像重载的运算符调用 我只是想知道编译
  • 了解 OpenCV LBP 实现

    我需要一些关于基于 LBP 的人脸检测的帮助 这就是我写这篇文章的原因 我有以下与 OpenCV 上实现的人脸检测相关的问题 在 lbpCascade frontal face xml 中 来自 opencv 什么是 内部节点 叶值 树 特
  • 如何使用 FCM 使用 php 脚本向多个设备发送推送通知?

    我是使用 FCM 从 php 向 Android 设备推送通知的新手 从 android 端 我生成了 FCM reg id 并通过 php 脚本发送它并存储到 mysql 数据库中 现在 我想同时从 php 脚本向多个 Android 设
  • 在 C# 中如何检测浮点数是否具有重复的小数扩展?

    我只需要知道如何检测浮点数中的重复小数扩展 Example 0 123456789123456789 该号码的重复部分为 123456789 我想用 C 实现自动化 有什么聪明的解决方案吗 有一个很好的技巧可以计算给定浮点数的有理近似值 基
  • @RepositoryEventHandler 事件以 @RepositoryRestController 停止

    当我创建一个 RepositoryRestController对于一个实体 关联的 RepositoryEventHandler方法不会通过 Spring Boot 1 4 0 M3 也包括 Spring Boot 1 3 5 在 Spri
  • Laravel UTF-8 到数据库

    我正在使用 Eloquent 将一个新人 save 到我的数据库中 人名包含特殊字符 并且它没有提交 这是我的步骤和结果 echo Input get firstname Migu l 这给了我这个 Migu l 当我开始使用 eloque
  • Foldr 与 Foldl(或 Foldl')的含义

    首先 现实世界哈斯克尔我正在读的书说永远不要使用foldl并改为使用foldl 所以我相信它 但我不知道什么时候使用foldr vs foldl 尽管我可以看到它们以不同方式工作的结构摆在我面前 但我太愚蠢了 无法理解什么时候 哪个更好 我
  • 使用 Git 内部的 Winmerge 来归档 diff

    有没有办法在 git 内部使用 Winmerge 来进行 Diffs 6 年后 2015 年 6 月更新 详见 git mergetool winmerge 一个简单的git config diff tool winmerge就足够了 Gi
  • 允许同时创建多少个AVPlayer?

    我有一个collectionView和每个cell has an AVPlayer即将播放 所以每个细胞都在同时播放视频 iOS 好像只允许同时播放 16 个视频 例如 请查看下面我的示例应用程序 满分 50cells 只有 16 人开始播
  • 从动作脚本库中检测 AIR 与 Flash Player

    我有一个 SWC 其操作方式需要略有不同 具体取决于它是否由 AIR 托管 我在网上看到了两个建议 测试 WindowedApplication 的 Application application 测试 Security sandboxTy
  • Ruby on Rails 中自动递增非主键字段

    在RoR迁移中 如何自动递增非主键字段 我想在数据库定义中而不是在模型中执行此操作 您需要执行一条 SQL 语句 statement ALTER TABLE users CHANGE id id SMALLINT 5 UNSIGNED NO
  • 隐藏解释器导入的模块

    我构建了一个模块 它使用几个不同的模块来完成各种任务 当我在 IPython 中导入模块并列出可用于自动完成的函数时 这些外部模块包含在该列表中 是否有可能以某种方式隐藏它们 在Python中 模块可以定义一个 all 变量 它是某人执行以
  • MVC“添加控制器”是“无法检索元数据...配置系统无法初始化”

    我从头开始创建了一个包含两个项目的新解决方案 一个是 MVC 3 另一个是支持 EF 4 2 项目 整个事情构建成功 我从 MVC 项目中打开 添加控制器 对话框 并让它根据我从支持 EF 项目中选择的上下文和模型生成代码 添加控制器 对话
  • 后台计时器更新 UI?

    我的申请遇到了一点问题 我想每 10 秒更新一次 UI 上的内容 我首先使用了一个DispatcherTimer为此 但它会在短时间内阻止我的 UI 因为更新方法需要从网络加载某些内容 并且此操作需要一些时间 现在我想到了某种后台工作者 然
  • Windows批处理脚本解析CSV文件并输出文本文件

    我在另一个页面上看到了回复 帮助编写批处理脚本来解析 CSV 文件并输出文本文件 出色的代码顺便说一句 ECHO OFF IF 1 GOTO EOF SET filename 1 SET fcount 0 SET linenum 0 FOR