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

回复 18# terse


   18L的代码这个可以成功读取网页的那种格式了,但是分隔符还是逗号。
19L的代码可以了。

不过这两个代码都加了-Encoding UTF8这个参数是为什么?源数据也是UTF8啊

TOP

试试这样呢
  1. (gc .\a.txt -Encoding UTF8|ConvertFrom-Json).data.ForEach({"{0}|{1}|{2}" -f $_.fileId,$_.fileName,$_.fileSize  })
复制代码
回复 17# lonron

TOP

  1. ((gc .\aa.txt -Encoding UTF8|ConvertFrom-Json).data|group fileId,fileName,fileSize).name
复制代码
回复 15# lonron

TOP

本帖最后由 lonron 于 2023-4-25 11:19 编辑

回复 16# aloha20200628


    感谢,第二个转换的时候会把我其他同目录文件也一起转换了,不知道为啥。

另外,能否麻烦老师帮忙看下14楼这位老师里面提到的PS的方法,
  1. powershell "((sls '\{.*?\}' 'test.txt' -allmatches).matches.value | convertfrom-json | group 'fileId','fileName').name"
复制代码
我测试过如果用的是我帖子里的例子是可以成功转换的,但是如果用 https://189.ly93.cc/qieiaeUNRrMj?accessCode=? 里的这种就报错了。还有就是它得出的结果用的分隔符是逗号的,实际文件名有可能也存在逗号的情况,所以最好能用别的分隔符来代替,比如“|”。因为“|”在windows的文件名规则中并不被允许保存。

在cmd满足不了的前提下,我个人还是倾向PS一点,主要是代码看起来也简洁点,对我一个小白来说读起来还算能理解。
而且就上面这个PS代码来说貌似也不存在转换编码的问题,我试过当源数据是UTF-8的时候,如果保存的PS文本也是UTF-8,得出的结果不会报错。
因为实际情况是我在爬取网页数据的时候我希望我不用手动另存为其他编码就可以正确截取我要的数据列,而且我的脚本最好保存的也是UTF-8的,所以想尽可能保持数据原样,因为要考虑转换的情况下那代码可能就太长了。

TOP

楼主如是,就请cmd同门js@cscript出场相助吧,其胃口要比8K大多了,所要的三项数据正好联排,用js可直接定点剥离...
  1. @set @v=1 /*
  2. @echo off
  3. ::输入文件须为ansi(简中编码)
  4. set "jsonF=test.txt"
  5. (cscript.exe -e:jscript "%~f0" "%jsonF%")
  6. pause&exit/b
  7. */
  8. var v=WSH.arguments;
  9. if (v.length==0) WSH.quit();
  10. var fso=new ActiveXObject('scripting.filesystemobject');
  11. var fr=fso.opentextfile(v(0)), all=fr.readall(); fr.close();
  12. var line,nb,ne,line;
  13. for (nb=all.indexOf('\"fileId\":');
  14. nb>0;
  15. nb=all.indexOf('\"fileId\":',ne)) {
  16. ne=all.indexOf('\"fileType\":',nb);
  17. if (ne==-1) break; //遭遇残缺数据则退出
  18. line=all.slice(nb,ne-1);
  19. WSH.echo(line);
  20. }
  21. WSH.quit();
复制代码


关于utf-8文件转为简中(gb2312)编码可以试试如下的PS代码》将指定目录中的全部utf-8文件转为gb213...

  1. @echo off
  2. set "u8D=" &set/p "u8D=拖入一个仅含UTF8编码文件的目录: "
  3. if not defined u8D exit
  4. cd /d %u8D% 2>nul
  5. echo,转换开始...
  6. powershell -nop -c "$dir=dir *.*;foreach($_ in $dir){$txtLines=[System.IO.File]::ReadLines($_.FullName,[text.encoding]::UTF8);[System.IO.File]::WriteAllLines($_.FullName+'.ansi',$txtLines,[text.encoding]::Default)}"
  7. echo,请到 %u8D% 查看转换结果
  8. pause&exit/b
复制代码
1

评分人数

    • lonron: 感谢提供思路技术 + 1

TOP

回复 14# terse


    感谢老师帮助,请问powershell的这个方式如果在 https://189.ly93.cc/qieiaeUNRrMj?accessCode=? 上面这种格式的数据头要如何修改?以及数据段落之间能否换成其他分隔符,比如 “|”。
另外因为数据源我是在网页上抓取的,本身自动保存的是UTF-8格式,如果在完全不考虑手动另存为的情况,如何将JS的这两种方式在数据源带中文的时候可以不乱码?

TOP

本帖最后由 terse 于 2023-4-25 01:44 编辑
  1. @if(0)==(0) echo off
  2. cscript -NoLogo -E:JScript %0 <a.txt
  3. pause & exit
  4. 文件有中文情况,存为ANSI格式
  5. @end
  6. var text =WSH.StdIn.ReadAll();
  7. var arr=text.match(/\{.*?\}/g)
  8. for (i = 0, len=arr.length; i<len; i++) {
  9.       var obj = new Function("return" + unescape(arr[i]))();
  10.       WSH.Echo(obj.fileId,obj.fileName,obj.fileSize);
  11. }
复制代码
  1. powershell "((sls -Path .\aa.txt -Pattern '\{.*?\}' -AllMatches ).Matches.Value|ConvertFrom-Json|group fileId,fileName,fileSize).name"
复制代码
另一种格式的话
  1. @if(0)==(0) echo off
  2. cscript -NoLogo -E:JScript %0 <a.txt
  3. pause & exit
  4. 文件有中文情况,存为ANSI格式
  5. @end
  6. var text =WSH.StdIn.ReadAll();
  7. var obj = new Function("return" + unescape(text))();
  8. var arr = obj.data;
  9. for (i = 0, len=arr.length; i<len; i++) {
  10.       WSH.Echo(arr[i].fileId,arr[i].fileName,arr[i].fileSize);
  11. }
复制代码
1

评分人数

    • lonron: 感谢帮助,PS的方式很赞技术 + 1

TOP

本帖最后由 lonron 于 2023-5-8 10:36 编辑

回复 11# aloha20200628


    如果可以不借助第三方命令确实很好,不过for好像单行8000多个左右的字符就无效了,实际的数据比我列出的多多了。有没有办法绕过for的单行数据字符数量限制?

TOP

这是json 为什么不直接用jscript脚本呢?
你好

TOP

给一个纯P解法》test.txt存为ansi(简中)格式。
  1. @echo off
  2. for /f "delims=" %%a in (test.txt) do (set "all=%%a")
  3. set alllines=%all:},=}^&echo,%
  4. (echo,%alllines%)>test.new
  5. for /f "tokens=1-3 delims={," %%1 in (test.new) do (echo,%%1,%%2,%%3)
  6. pause&exit/b
复制代码

TOP

回复 9# lonron


   

我也没学过sed,试了一下
  1. @sed -i "/},/ s//\n/g;/:/ s//\n/g" 1.txt
复制代码


将 }, 和 : 替换为换行符
1

评分人数

bat小白,请多指教!谢谢!

TOP

回复 5# 77七


    老师您好,我在使用sed命令之后有一个疑问,需要您帮忙解答下:是否可以在一条命令中定义两处或以上不同符号的换行操作?如果可以应该怎么写?(我不会正则表达式)

TOP

回复 3# lonron
  1. @echo off
  2. chcp 65001
  3. jq64.exe < "test.txt" | findstr /c:"fileId" /c:"fileName" /c:"fileSize" > "test_new1.txt"
  4. (for /f "tokens=1* delims=:" %%i in ('type "test_new1.txt"') do (
  5.     set /p ="%%i:%%j "<nul
  6.     if "%%i" equ "    "fileSize"" (
  7.         echo,
  8.     )
  9. ))>"test_new2.txt"
复制代码
1

评分人数

我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 6# lonron


   http://bcn.bathome.net/tool/4.8/sed.exe sed  流文本处理工具
bat小白,请多指教!谢谢!

TOP

回复 5# 77七


    http://bcn.bathome.net/s/tool/index.html?key=sed
是这里面哪个工具?

TOP

返回列表