无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 780|回复: 14
打印 上一主题 下一主题

[讨论] for怎么取文本中分隔符前的空值呢

[复制链接]
跳转到指定楼层
1#
发表于 2024-12-3 12:31:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 1G空间100元 于 2024-12-3 13:55 编辑

比如文件seo.txt内容为(|的前后没空格):
||baidu.com|so.com|
脚本为:
for /f "usebackq tokens=1-4 delims=|" %%a in ("seo.txt") do (
    set "seo1=%%a"
    set "seo2=%%b"
    set "seo3=%%c"
    set "seo4=%%d"
)
    echo seo1=%seo1%
    echo seo2=%seo2%
    echo seo3=%seo3%
    echo seo4=%seo4%
第一个分隔符|前是空值但是没被赋值,直接过滤掉了,想达到的效果:
需要seo1取第一个分隔符前的值(包含空值),seo2取第2个分隔符前的值(包含空值),seo3取第3个分隔符前的值(包含空值),seo4取第4个分隔符前的值(包含空值)
按照上面给出的seo.txt内容,就是:
seo1的值为空,seo2的值为空,seo3的值为baidu.com,seo4的值为so.com
是需要for读取txt文本有空值时赋予变量为空值,不是直接在脚本里指定变量为空
应该怎么修改脚本呢?




2#
发表于 2024-12-3 12:36:03 | 只看该作者
“”
回复

使用道具 举报

3#
发表于 2024-12-3 13:38:42 | 只看该作者
本帖最后由 hua_wuxin 于 2024-12-3 13:40 编辑

备用保底方案:

for /f "usebackq tokens=1-4 delims=|" %%a in ("seo.txt") do (
  if defined %%d (
    set "seo1=%%a"
    set "seo2=%%b"
    set "seo3=%%c"
    set "seo4=%%d"
  ) else (
    set "seo1="
    set "seo2="
    set "seo3=%%a"
    set "seo4=%%b"
  )
)

点评

正常情况下每个分隔符前都是有值的,但是有时候可能是空的,需要将空值也赋予变量: 比如seo.txt的内容可能是: google.cn||baidu.com|so.com| 也可能是 google.cn|bing.com|baidu.com|so.com| 也有可能是 goo  详情 回复 发表于 2024-12-3 13:48
你这个情况是提前知道前面是2个空值,但是在实际情况有可能是第三个分割符前为空,比如:|baidu.com||so.com|  发表于 2024-12-3 13:44
回复

使用道具 举报

4#
 楼主| 发表于 2024-12-3 13:48:01 | 只看该作者
本帖最后由 1G空间100元 于 2024-12-3 13:56 编辑
hua_wuxin 发表于 2024-12-3 13:38
备用保底方案:

for /f "usebackq tokens=1-4 delims=|" %%a in ("seo.txt") do (

正常情况下每个分隔符前都是有值的,但是有时候可能是空的,需要将空值也赋予变量:
比如seo.txt的内容可能是:
google.cn||baidu.com|so.com|
也可能是
google.cn|bing.com|baidu.com|so.com|
也有可能是
google.cn|bing.com||so.com|

|bing.com|baidu.com|so.com|
就是想将4个变量 在有空值的时候也自动赋予变量为空值,而不是过滤掉

点评

不改变seo.txt内容的前提下好像是不好办了 等等看有没有其他坛友有办法吧  详情 回复 发表于 2024-12-3 13:55
回复

使用道具 举报

5#
发表于 2024-12-3 13:55:26 | 只看该作者
1G空间100元 发表于 2024-12-3 13:48
正常情况下每个分隔符前都是有值的,但是有时候可能是空的,需要将空值也赋予变量:
比如seo.txt的内容 ...

不改变seo.txt内容的前提下好像是不好办了
等等看有没有其他坛友有办法吧
回复

使用道具 举报

6#
发表于 2024-12-3 14:56:06 | 只看该作者
本帖最后由 slore 于 2024-12-3 14:58 编辑
  1. @echo off
  2. for /f "delims=" %%a in (seo.txt) do call :UPDATE_LINE "%%a"
  3. pause && goto :EOF

  4. :UPDATE_LINE
  5. set "line=#%~1#"
  6. set "line=%line:|=#%"
  7. set "line=%line:##=#-#%"
  8. for /f "tokens=1-4 delims=#" %%a in ("%line%") do (
  9.     echo a=[%%a],        b=[%%b],        c=[%%c],        d=[%%d]
  10. )
  11. goto :EOF
复制代码

点评

连续空白的话,多加一行替换就行。 :UPDATE_LINE set "line=#%~1#" set "line=%line:|=#%" set "line=%line:###=#-#-#%" set "line=%line:##=#-#%"  详情 回复 发表于 2024-12-3 18:34
很接近了 但是第一个|前是空值是,无法赋予第一个变量为空值,比如||baidu.com|so.com|,一起4个分隔符|,第一个和第2个分隔符前是空值,baidu.com应该是第3个变量的值,跑到第2个变量去了。  发表于 2024-12-3 18:08
回复

使用道具 举报

7#
发表于 2024-12-3 18:34:07 | 只看该作者

连续空白的话,多加一行替换就行。

:UPDATE_LINE
set "line=#%~1#"
set "line=%line:|=#%"
set "line=%line:###=#-#-#%"
set "line=%line:##=#-#%"

点评

靠谱 达到效果了  发表于 2024-12-3 19:01
回复

使用道具 举报

8#
发表于 2024-12-3 20:09:36 | 只看该作者
学习 谢谢
回复

使用道具 举报

9#
发表于 2024-12-3 20:17:14 | 只看该作者
学习了 感谢分享
回复

使用道具 举报

10#
发表于 2024-12-4 07:25:02 | 只看该作者
感谢分享
回复

使用道具 举报

11#
发表于 2024-12-4 11:11:42 | 只看该作者
来学习下
回复

使用道具 举报

12#
发表于 2024-12-6 14:38:50 | 只看该作者
学习
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-12-26 23:23

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表