[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 批处理命令for /f 取值后赋值给变量,分隔符用什么?

有个123.txt文件,里面有这些信息:
{"Type":0,"Aid":"558660944","Bid":"BV1je4y1z7S3","Cid":"850965837","SeasonId":null,"EpisodeId":null,"Title":"99%都不知道的中医经络、穴位功能记忆口诀,太全了 03:38教你快速记住人体12条经络 中医经络穴位全脑速记--关于记忆的几点分享 十二正经穴位快速记忆","Uploader":"逆袭教典澄","Description":"中医经络穴位全脑速记","CoverURL":"http://i1.hdslb.com/bfs/archive/751cbc3b35df0df651715a3c0815a85bb1ee2ac3.png","Tag":null,"From":"vupload","PartNo":"1","PartName":"00中医经络穴位全脑速记--关于记忆的几点分享","Format":2,"TotalParts":1,"DownloadTimeRelative":252945257,"CreateDate":"2022-10-03 16:48"}

现在想获取PartName":"    到  ","Format" 之间的内容,写入变量。
写了个循环 成功读取到这个内容,
  1. for /f "delims=,  tokens=14 usebackq"  %%i in ("123.txt") do (set partname=%%i)
复制代码
delims=用的逗号分割的 ,发现其它txt样本的逗号的数量不一定是多少个,所以会取不到值,
请教一下,还有别的方法吗?
可以用引号作为分隔符吗? 或者 用delims=","  用这三个字符 分隔,我用了闪退,不知道怎么把引号转义

本帖最后由 andycker 于 2022-10-8 22:35 编辑

参考论坛的帖子,使用转义的方法把引号作为分隔符,后发现tokens超过31的数字 就不能输出,看来没解了
  1. for /f delims^=^*^  tokens^=31  %%i in (123.txt) do (echo %%i)
复制代码
如果把tokens的31换成32或者更大的数字  ,不能输出,不知道为什么

TOP

本帖最后由 andycker 于 2022-10-8 22:57 编辑

回复 2# andycker


    找到了WHY的帖子
看看能不能解决
for /f "tokens=31* delims=," %%i in (1.txt) do (
    for /f "tokens=23 delims=," %%k in ("%%j") do echo;%%k
)

TOP

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%a in ('findstr "PartName.*Format" 123.txt') do (
  4.     set "str=%%a"
  5.     set "str=!str:*PartName":=!"
  6.     for /f "delims=," %%b in ("!str!") do set partname=%%~b
  7. )
  8. pause
复制代码

TOP

回复 1# andycker


如果遇到复杂的JSON格式,可以考虑调用第三方命令行工具,比如 jq.exe
http://bcn.bathome.net/s/tool/index.html?key=jq
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

解法备注》
一。可以不管 JSON 列表中的分隔符数量
二。选择一个特殊的字符作为卡位字符(此处采用◆)
三。只要 JSON 列表长度不超过CMD对单个变量长度的上限(8KB)
  1. @echo off &setlocal enabledelayedexpansion
  2. for /f "usebackq delims=" %%a in ("123.txt") do (
  3. set "s=%%a"
  4. set s=!s:"PartName":"=◆!
  5. set s=!s:","Format"=◆!
  6. for /f "tokens=1-2 delims=◆" %%1 in ("!s!") do echo,%%2
  7. )
  8. endlocal&pause&exit/b
复制代码

TOP

回复 4# qixiaobin0715


    qixiaobin0715  你的代码很厉害

TOP

回复 5# Batcher


    谢谢管理员

TOP

回复 6# aloha20200628


    读懂了你的意思,谢谢

TOP

返回列表