Board logo

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

作者: delab-1    时间: 2024-9-2 18:01     标题: 确定字符串包含字母的个数,并根据个数多少进行替换

各位大神,碰到一个棘手问题,想大家请教。我有一个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。

感谢各位的帮助了
作者: newswan    时间: 2024-9-2 19:18

  1. awk -F',' '{ if (length($2) < 8) { $2 = sprintf("%08d", $2); } print $0; }' test.csv
复制代码

作者: aloha20200628    时间: 2024-9-2 19:32

本帖最后由 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
复制代码

作者: qixiaobin0715    时间: 2024-9-3 09:05

本帖最后由 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
复制代码

作者: delab-1    时间: 2024-9-3 09:13

回复 2# newswan


   这个代码我没有过,是批处理系统吗?有没有教程,我去学习一下,觉得很简洁很有用的
作者: delab-1    时间: 2024-9-3 09:17

回复 3# aloha20200628


    感谢感谢,真是太感谢了 :handshake
作者: delab-1    时间: 2024-9-3 09:18

回复 4# qixiaobin0715


    这又提醒我一个新思路,很棒!
作者: qixiaobin0715    时间: 2024-9-3 09:24

回复 7# delab-1
4楼内容开始有点问题,刚刚修改了。
作者: delab-1    时间: 2024-9-3 09:39

本帖最后由 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!"似乎是空值
作者: qixiaobin0715    时间: 2024-9-3 09:46

本帖最后由 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
复制代码
你可能没理解对。
作者: delab-1    时间: 2024-9-3 09:49

回复 10# qixiaobin0715


    非常感谢,是没问题的。上面反馈修正了,感谢感谢
作者: newswan    时间: 2024-9-3 10:43

回复 5# delab-1

sed awk grep ,linux 下的工具。
windows 版,论坛里有,也可以安装 msys 全套
作者: aloha20200628    时间: 2024-9-3 11:42

本帖最后由 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
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2