找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 14869|回复: 12

[文本处理] 确定字符串包含字母的个数,并根据个数多少进行替换

[复制链接]
发表于 2024-9-2 18:01:02 | 显示全部楼层 |阅读模式
各位大神,碰到一个棘手问题,想大家请教。我有一个test.csv文件,其内容大致如下
yearmonth,com_code,partner_code,way_code,province_code,amount1,unit1,amount2,unit2,dollar
202307,8119090,133,10,21,176000,吨,0,?,560214
202307,8119090,133,10,32,4032,吨,0,?,20295
202307,16055400,116,10,21,309349,吨,0,?,3450954
202307,16055400,116,10,32,16850,吨,0,?,496465

我想做一个循环,去完成一下任务:
1)确认com_code中的字符个数,如果字符个数小于8个,就在其前面加入一个0。例如,第二行的com_code数值是8119090,个数小于8,那么就在前面加入一个0。
2)将改进后的文件保存下来。也就是说在改进所有的com_code后,其它内容依然保留,然后把新文件保存为new_test.csv。

感谢各位的帮助了
发表于 2024-9-2 19:18:08 | 显示全部楼层

  1. awk -F',' '{ if (length($2) < 8) { $2 = sprintf("%08d", $2); } print $0; }' test.csv
复制代码
发表于 2024-9-2 19:32:11 | 显示全部楼层
本帖最后由 aloha20200628 于 2024-9-2 19:43 编辑

回复 1# delab-1

  1. @echo off
  2. (echo,yearmonth,com_code,partner_code,way_code,province_code,amount1,unit1,amount2,unit2,dollar
  3. for /f "skip=1 tokens=1,2* delims=," %%a in (test.csv) do (
  4.         set "v2=%%b" &setlocal enabledelayedexpansion
  5.         if "!v2:~7!"=="" (echo,%%a,0%%b,%%c) else echo,%%a,%%b,%%c
  6.         endlocal
  7. ))>new_test.csv
  8. pause&exit/b
复制代码
发表于 2024-9-3 09:05:16 | 显示全部楼层
本帖最后由 qixiaobin0715 于 2024-9-3 10:08 编辑

楼主在1楼只是举了个例子,如果某一数据为123456,应当补全为00123456。感觉这样才是楼主真正的需求:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /f "tokens=1,2* delims=," %%i in (test.csv) do (
  4.     set Column2=%%j
  5.     if "!Column2:~7!"=="" (
  6.         set str=00000000%%j
  7.         set Column2=!str:~-8!
  8.     )
  9.     echo,%%i,!Column2!,%%k
  10. ))>New_test.csv
  11. pause
复制代码
 楼主| 发表于 2024-9-3 09:13:42 | 显示全部楼层
回复 2# newswan


   这个代码我没有过,是批处理系统吗?有没有教程,我去学习一下,觉得很简洁很有用的
 楼主| 发表于 2024-9-3 09:17:20 | 显示全部楼层
回复 3# aloha20200628


    感谢感谢,真是太感谢了 :handshake
 楼主| 发表于 2024-9-3 09:18:10 | 显示全部楼层
回复 4# qixiaobin0715


    这又提醒我一个新思路,很棒!
发表于 2024-9-3 09:24:09 | 显示全部楼层
回复 7# delab-1
4楼内容开始有点问题,刚刚修改了。
 楼主| 发表于 2024-9-3 09:39:15 | 显示全部楼层
本帖最后由 delab-1 于 2024-9-3 09:47 编辑

回复 3# aloha20200628

测试是成功的!不好意思,CSV文件用EXCEL打开的时候,前面的0不显示。但是下面是我的一个测试,也学对后来遇到问题的人有帮助。

    这个程序运行后不能成功,小于7的值并未在前面添加零。似乎这个"!v2:~7!"=="" 判定不可行,因为当数字小于8的时候,!v2:~7!反馈的不是空值。如果程序前面添加@echo off, !v2:~7!的取值是“echo 处于关闭状态。”,这个非常奇怪。我做了测试,这个取值不是空值,而是下面的几种情况:
1) 在前面加入echo off, 则取值为“echo 处于关闭状态。
2)前面没有加入echo off, 则取值为“echo 处于打开状态。
3)如果将echo行改为:echo the value is: "!v2:~7!",显示的结果是:echo the value is:  
    这种情况下给人的感觉"!v2:~7!"似乎是空值
发表于 2024-9-3 09:46:04 | 显示全部楼层
本帖最后由 qixiaobin0715 于 2024-9-3 09:48 编辑

回复 9# delab-1
试试下面代码:
  1. @echo off
  2. set n=123456
  3. set n=%n:~7%
  4. if defined n (echo,good) else echo,nul
  5. pause
复制代码
你可能没理解对。
 楼主| 发表于 2024-9-3 09:49:12 | 显示全部楼层
回复 10# qixiaobin0715


    非常感谢,是没问题的。上面反馈修正了,感谢感谢
发表于 2024-9-3 10:43:50 | 显示全部楼层
回复 5# delab-1

sed awk grep ,linux 下的工具。
windows 版,论坛里有,也可以安装 msys 全套
发表于 2024-9-3 11:42:57 | 显示全部楼层
本帖最后由 aloha20200628 于 2024-9-3 12:11 编辑

回复 9# delab-1

*.csv文件中前缀0的数值字段 0654321 改为 ="0654321" 格式即可被 excel 正确显示,故调整3楼代码如下,楼主可试试 ...

  1. @echo off
  2. (echo,yearmonth,com_code,partner_code,way_code,province_code,amount1,unit1,amount2,unit2,dollar
  3. for /f "skip=1 tokens=1,2* delims=," %%a in (test.csv) do (
  4.         set "v2=%%b" &setlocal enabledelayedexpansion
  5.         if "!v2:~7!"=="" (echo,%%a,="0%%b",%%c) else echo,%%a,%%b,%%c
  6.         endlocal
  7. ))>new_test.csv
  8. pause&exit/b
复制代码
关于用 "!v:~7!"=="" 或 "%v:~7%"==""  判断字符串变量v是否为8+位字符的问题,可用以下测试代码看其结果,一目了然...

  1. @echo off
  2. set v=654321
  3. if "%v:~7%"=="" (echo,0%v%) else echo,%v%
  4. set v=7654321
  5. if "%v:~7%"=="" (echo,0%v%) else echo,%v%
  6. set v=87654321
  7. if "%v:~7%"=="" (echo,0%v%) else echo,%v%
  8. set v=987654321
  9. if "%v:~7%"=="" (echo,0%v%) else echo,%v%
  10. pause&exit/b
复制代码

评分

参与人数 1技术 +1 收起 理由
77七 + 1 感谢分享

查看全部评分

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

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 21:02 , Processed in 0.020615 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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