Board logo

标题: [文本处理] 批处理如何根据指定条件对CSV内容进行筛选、删除、输出 [打印本页]

作者: q121212    时间: 2016-8-15 22:51     标题: 批处理如何根据指定条件对CSV内容进行筛选、删除、输出

如图,我有一个CSV文件000.csv,有非常多列,大概有不到50列,这里演示文档就不赘述了。
我要对这个CSV做一步筛选、细分,规则如下:

1. 筛选 “第1列=空”     的所有行,从CSV中移除。
2. 筛选 “第1列==王1“ 的所有行,从CSV中移除。
3. 筛选 “第2列<26”    的所有行,导出到001.csv中。  (要这一整行所有内容,类似复制,原CSV中还有这些行)
4. 筛选“籍贯”并进行如下操作:(注意:K列目前是空值)
     G列=北京:K列赋值=1
     G列=福建:K列赋值=2
     G列=广东:K列赋值=3
     G列=湖南:K列赋值=4
     ……
     …
      如上,类似先将G列字段做一个排序映射,然后对每一行里的K列进行赋值。
      这个需求有些麻烦,甚至我觉得都不应该是批处理做的事情。我不知道这样描述大家能不能理解,也不知道批处理能不能解得出来,各位量力而行,谢谢。
作者: GNU    时间: 2016-8-15 23:01

不用任何脚本,纯Excel操作,2分钟之内应该可以搞定吧。
作者: pcl_test    时间: 2016-8-15 23:49

本帖最后由 pcl_test 于 2016-8-15 23:50 编辑
  1. @echo off&setlocal enabledelayedexpansion
  2. findstr /v /r /c:"^[ ]*," /c:"^王1" "000.csv">$
  3. move $ "000.csv"&rem 覆盖原文件,注意备份
  4. findstr /r "姓名 ^[^,]*,[1-9], ^[^,]*,1[0-9] ^[^,]*,2[0-5]" "000.csv">"001.csv"
  5. for /f "delims=" %%a in ('more +9 "%~f0"') do set "%%a"
  6. for /f "delims=" %%a in ('type "000.csv"') do (
  7.     for /f "tokens=7 delims=," %%b in ("%%a") do echo;%%a,!%%b!
  8. )
  9. pause&exit
  10. 北京=1
  11. 福建=2
  12. 广东=3
  13. 湖南=4
复制代码

作者: pcl_test    时间: 2016-8-16 00:51

本帖最后由 pcl_test 于 2016-8-16 09:04 编辑

第三方http://www.bathome.net/s/tool/index.html?key=gawk
  1. #*&cls&gawk -f "%~f0"|find /v ""&pause&exit
  2. BEGIN{
  3.     FS=",";csv="000.csv";
  4.     split("北京=1,福建=2,广东=3,湖南=4",a,",");
  5.     for(i=1;i<=length(a);i++){split(a[i],b,"=");c[b[1]]=b[2];}
  6.     while(getline<csv>0){
  7.         if($1&&$1!~/^[[:space:]]+$/&&$1!~/王1/){
  8.             if($1~/姓名/||$2*1<26)print $0>"001.csv";
  9.             print c[$7]?$0","c[$7]:$0;
  10.         }
  11.     }
  12. }
复制代码

作者: q121212    时间: 2016-8-16 08:52

回复 2# GNU


    体量小的话,是不会有这种需求的。就是为了解决繁琐的重复作业,才驱动我们不断考虑 “有没有省事儿点的办法”。
作者: q121212    时间: 2016-8-16 21:28

回复 4# pcl_test


谢谢回复,白天上班没来及验证和回复。不好意思。
我试了第一种解法,第二种涉及第三方,我还不会用

发现:
在处理1、2需求时非常方便,删除指定行。
在处理3需求时,确实也能达到我想要的效果,但是处理方式只能这样写么,感觉不太灵活啊
需求4,我没想到居然可以,老实说我没能看懂....,但是有些要补充的:
         1.批处理回显窗口上是可以得到结果的,但是并没有写入到000.csv中
         2.我之前描述的可能有问题,需求4要在需求3之前执行
         3.这里的北京、福建是举例,实际上的CSV中,这一项并没有重复值,一般都时中文开头,当然也有时候是一串英文(外贸)
不知道能否再帮忙看下,感谢。
作者: GNU    时间: 2016-8-17 13:14

第二种涉及第三方,我还不会用

下载一个gawk.exe放在C:\Windows\System32这个文件夹下面




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