返回列表 发帖

[文本处理] [已解决]批处理如何将同一行内容自动换行?

本帖最后由 lonron 于 2023-4-14 21:02 编辑
{"fileId":"82474140744160028","fileName":"测试文件1.exe","fileSize":1575742,"fileType":"exe","isFolder":false,"createTime":"2022-12-19 14:58:31","lastOpTime":"2023-03-30 18:00:48","url":"436c7fd527213cb63d26dde4be6d702b5c50b0a19617b0f577fdc395095ad220fbbeb6e462ab99f63a2b2f5ccc9b428b98715086072763289c44b26e7e7c92d6"},{"fileId":"82486141026441368","fileName":"测试文件2.exe","fileSize":2021129740,"fileType":"exe","isFolder":false,"createTime":"2022-12-21 12:03:02","lastOpTime":"2023-03-30 18:02:45","url":"436c7fd527213cb63d26dde4be6d702b5c50b0a19617b0f577fdc395095ad22073f81f0692d5a6bb0c647e4ec30104b998715086072763289c44b26e7e7c92d6"},{"fileId":"52393157241817145","fileName":"测试文件3.exe","fileSize":3270166619,"fileType":"exe","isFolder":false,"createTime":"2023-03-24 22:02:27","lastOpTime":"2023-03-30 18:02:39","url":"436c7fd527213cb63d26dde4be6d702b6dbc0c88d300af99ea325241126fbda9c9055f4cc6dd7264a2f3166668bcbb5998715086072763289c44b26e7e7c92d6"},{"fileId":"72408159516708019","fileName":"测试文件4.exe","fileSize":124534230,"fileType":"exe","isFolder":false,"createTime":"2023-04-06 13:02:06","lastOpTime":"2023-04-06 13:02:06","url":"436c7fd527213cb63d26dde4be6d702bf1e905559843e42cea1dae75df4e28229ddf191b0cc2660c4d0f555b2c4ddc7598715086072763289c44b26e7e7c92d6"},{"fileId":"92365143335143586","fileName":"测试文件5.exe","fileSize":26051557,"fileType":"exe","isFolder":false,"createTime":"2023-01-05 16:08:27","lastOpTime":"2023-03-30 18:02:33","url":"436c7fd527213cb63d26dde4be6d702b8220e0080713c08cbe1e9f4139522e664a289dd4dca12eb9af645ea22958582298715086072763289c44b26e7e7c92d6"},{"fileId":"62329140744365621","fileName":"测试文件6.exe","fileSize":35043416,"fileType":"exe","isFolder":false,"createTime":"2022-12-19 15:01:20","lastOpTime":"2023-03-30 18:02:27","url":"436c7fd527213cb63d26dde4be6d702b883eef7895d30b8c0cec047a5ba099256186f7b2ffaeacba207c74a89637074c98715086072763289c44b26e7e7c92d6"},{"fileId":"12486140744030191","fileName":"测试文件7.exe","fileSize":59686896,"fileType":"exe","isFolder":false,"createTime":"2022-12-19 14:57:41","lastOpTime":"2023-03-30 18:00:21","url":"436c7fd527213cb63d26dde4be6d702b3f13d9e5712fb34717f2317a8eb682cfd1f36a9d465fc0f90e759b702ea4605198715086072763289c44b26e7e7c92d6"},{"fileId":"22486145619725981","fileName":"测试文件8.exe","fileSize":85052424,"fileType":"exe","isFolder":false,"createTime":"2023-01-18 22:44:19","lastOpTime":"2023-03-30 18:01:46","url":"436c7fd527213cb63d26dde4be6d702b592b947f1de0a4f83de736a55ce2c23ae8e8ea6d1096d69a56b1a344d88a811f98715086072763289c44b26e7e7c92d6"},{"fileId":"52550160899027709","fileName":"测试文件9.exe","fileSize":2193907800,"fileType":"exe","isFolder":false,"createTime":"2023-04-14 09:13:35","lastOpTime":"2023-04-14 09:13:35","url":"436c7fd527213cb63d26dde4be6d702b6dbc0c88d300af99ea325241126fbda92e4a1efac943fbec0f12de9d5b4a7bfc98715086072763289c44b26e7e7c92d6"},{"fileId":"92415142359643162","fileName":"测试文件10.exe","fileSize":30655423,"fileType":"exe","isFolder":false,"createTime":"2022-12-30 14:40:35","lastOpTime":"2023-03-30 18:00:40","url":"436c7fd527213cb63d26dde4be6d702b8220e0080713c08cbe1e9f4139522e66209a2014fac136399ad357c10714b7f598715086072763289c44b26e7e7c92d6"}COPY
如上数据,保存在本地的一个命名为test.txt的文本文件。
由于数据都在 同一行 且可能实际数据量更多,所以直接用 for 循环可能会存在变量不够用的情况。
故想请教各位老师是否可以将这一行数据用什么命令使其在特定位置换行,然后再用 for 将 fileId、fileName、fileSize 后的这三个数据提取出来。
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

本帖最后由 lonron 于 2023-4-14 16:06 编辑

回复 2# Batcher


    得出的结果是这样的,
    "fileId": "82474140744160028",
    "fileName": "测试文件1.exe",
    "fileSize": 1575742,
    "fileId": "82486141026441368",
    "fileName": "测试文件2.exe",
    "fileSize": 2021129740,
    "fileId": "52393157241817145",
    "fileName": "测试文件3.exe",
    "fileSize": 3270166619,COPY
能否把这三个字段输出在同一行呢?
像这样:
    "fileId": "82474140744160028","fileName": "测试文件1.exe","fileSize": 1575742,
    "fileId": "82486141026441368","fileName": "测试文件2.exe","fileSize": 2021129740,
    "fileId": "52393157241817145","fileName": "测试文件3.exe","fileSize": 3270166619,COPY

TOP

回复 2# Batcher


    老师帮帮忙!

TOP

回复 5# 77七


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

TOP

回复 5# 77七


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

TOP

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

回复 11# aloha20200628


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

TOP

回复 14# terse


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

TOP

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

回复 16# aloha20200628


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

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

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

TOP

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

回复 18# terse


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

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

TOP

回复 21# terse


    好的,真的非常感谢,今天评分用完了,明天我追加给您,谢谢了

TOP

回复 19# terse


    老师,如果我不用gc的方式读取下载下来的本地json文件,而是直接从网页中获取,应该怎么写,我套用iwr时,中文部分乱码了,该如何修改?
powershell "(iwr 'https://189.ly93.cc/qieiaeUNRrMj?accessCode=?&accessToken=B29F77379D3A9977A6C840F8CEF74142' | convertfrom-json).data | % {'{0}|{1}' -f $_.fileId,$_.fileName}"COPY

TOP

本帖最后由 lonron 于 2023-4-25 18:17 编辑

回复 24# terse


    太强了!最后请教老师您两个问题:
    为什么加了.content属性就不会变成乱码了?
    iwr请求指定网址的时候,在控制台显示出来时,数据是保存在内存中的还是有实际路径的?

TOP

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

回复 26# terse
@echo off
for /f "delims=" %%a in ('curl "https://gitee.com/dm/releases/tag/t"') do (
    for /f "delims=" %%b in ('powershell "(echo '%%a' | ConvertFrom-Json).release.release.title"') do (
        echo %%b
    )
)
pauseCOPY
老师,还请您帮忙看下,还是类似的问题。
不知道为什么只有用curl命令时才会获取到json数据,如果用ps的irm和iwr获取的都只是html数据。
然后有了上面这段代码,结果是报错了。但当我把%%a重定向到文本之后,再用gc方式获取,然后结果是正确的。
或者直接把(echo '%%a' | ConvertFrom-Json).release.release.title 这部分,手动带入%%a的值,然后在ps控制台运行,结果也是正确的。

上面这段代码要怎么修改才能在不需要重定向文本的前提下,直接在cmd脚本里运行就能得到正确结果?

TOP

回复 28# terse


    就是第一个for里面的 curl得到的,这个不是ps的iwr别名,就是win10自带的curl命令,您看下返回值。

TOP

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

回复 28# terse
@echo off
for /f "delims=" %%a in ('curl "https://gitee.com/dm/releases/tag/t"') do (
    >"test.txt" echo %%a
    for /f "delims=" %%b in ('powershell "(gc 'test.txt' | ConvertFrom-Json).release.release.title"') do (
        echo %%b
    )
)
pauseCOPY
如果改成这样,返回值是我想要的,但是这需要输出到本地文本之后gc读取才行,我希望直接用curl的返回值直接处理,而不需要输出一个实体文本。

TOP

返回列表