标题: [文本处理] 确定字符串包含字母的个数,并根据个数多少进行替换 [打印本页]
作者: 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
- 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 - @echo off
- (echo,yearmonth,com_code,partner_code,way_code,province_code,amount1,unit1,amount2,unit2,dollar
- for /f "skip=1 tokens=1,2* delims=," %%a in (test.csv) do (
- set "v2=%%b" &setlocal enabledelayedexpansion
- if "!v2:~7!"=="" (echo,%%a,0%%b,%%c) else echo,%%a,%%b,%%c
- endlocal
- ))>new_test.csv
- pause&exit/b
复制代码
作者: qixiaobin0715 时间: 2024-9-3 09:05
本帖最后由 qixiaobin0715 于 2024-9-3 10:08 编辑
楼主在1楼只是举了个例子,如果某一数据为123456,应当补全为00123456。感觉这样才是楼主真正的需求:- @echo off
- setlocal enabledelayedexpansion
- (for /f "tokens=1,2* delims=," %%i in (test.csv) do (
- set Column2=%%j
- if "!Column2:~7!"=="" (
- set str=00000000%%j
- set Column2=!str:~-8!
- )
- echo,%%i,!Column2!,%%k
- ))>New_test.csv
- 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
试试下面代码:- @echo off
- set n=123456
- set n=%n:~7%
- if defined n (echo,good) else echo,nul
- 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楼代码如下,楼主可试试 ...- @echo off
- (echo,yearmonth,com_code,partner_code,way_code,province_code,amount1,unit1,amount2,unit2,dollar
- for /f "skip=1 tokens=1,2* delims=," %%a in (test.csv) do (
- set "v2=%%b" &setlocal enabledelayedexpansion
- if "!v2:~7!"=="" (echo,%%a,="0%%b",%%c) else echo,%%a,%%b,%%c
- endlocal
- ))>new_test.csv
- pause&exit/b
复制代码
关于用 "!v:~7!"=="" 或 "%v:~7%"=="" 判断字符串变量v是否为8+位字符的问题,可用以下测试代码看其结果,一目了然...- @echo off
- set v=654321
- if "%v:~7%"=="" (echo,0%v%) else echo,%v%
- set v=7654321
- if "%v:~7%"=="" (echo,0%v%) else echo,%v%
- set v=87654321
- if "%v:~7%"=="" (echo,0%v%) else echo,%v%
- set v=987654321
- if "%v:~7%"=="" (echo,0%v%) else echo,%v%
- pause&exit/b
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |