批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程
[批处理文件精品]批处理版照片整理器[批处理文件精品]纯批处理备份&还原驱动在线第三方下载
返回列表 发帖

【已解决】【50元求助】bat处理csv指定列,

本帖最后由 78785858 于 2022-4-14 00:18 编辑

因为无法上传附件,所以用文本表示:

原始数据
csv有很多列  只需要 节选第7列和第24列内容

名称        明细
R8888        aaaaa1(明细1,)*1
R8888        aaaaa1(明细1,)*1
R8886        aaaaa2(明细1,)*1
R8885        aaaaa3(明细1,)*2
R8884        aaaaa4(明细1,)*2
R8883        aaaaa1(明细1,)*3
R8882        aaaaa2(明细1,)*3
R8881        aaaaa1(明细1,)*4
R8880        aaaaa2(明细1,)*4
R8879        aaaaa1(明细1,)*5
R8878        aaaaa3(明细1,)*2
R8877        aaaaa4(明细1,)*2
R8876        aaaaa3(明细1,)*2
R8876        aaaaa3(明细1,)*2

输出结果
明细        数量        名称
aaaaa1        5        R8888
aaaaa1        5        R8883
aaaaa1        5        R8881
aaaaa1        5        R8879
aaaaa3        4        R8885
aaaaa3        4        R8878
aaaaa3        4        R8876
aaaaa2        3        R8886
aaaaa2        3        R8882
aaaaa2        3        R8880
aaaaa4        2        R8884
aaaaa4        2        R8877


excel手动操作实现步骤如下,
1、left(明细列,6)
2、countif(明细列,b2),得出明细重复的总数
3、删除 名称和明细两列都相同的重复值,
4、明细列降序排列

现求助bat、实现代码

本帖最后由 went 于 2022-4-13 23:51 编辑

test.bat
bat和csv文件都保存ansi编码
  1. #&cls&@cd /d "%~dp0"&powershell -c "Get-Content '%~0' | Out-String | Invoke-Expression" &pause&exit
  2. cls
  3. #输入csv文件
  4. $csv_in = '需要处理的.csv'
  5. #输出csv文件
  6. $csv_out = '1.csv'
  7. #名称明细列号
  8. $col1 = 7
  9. $col2 = 24
  10. &{
  11. '明细,数量,名称'
  12. &{
  13.     Get-Content $csv_in | Select-Object -Skip 1 | foreach {
  14.         $arr = $_ -replace ',,',',0,' -split ','
  15.         @{'a'=$arr[$col1-1];'b'=$arr[$col2-1] -replace '(.*$',''}
  16.     }
  17. } | Group-Object { $_.b } | Sort-Object { $_.Count } -Descending | foreach {
  18.     $__ = $_
  19.     $_.Group | foreach {
  20.         '{0},{1},{2}' -f $__.Name,$__.Count,$_.a
  21.     }
  22. }
  23. } | Select-Object -Unique | Out-File $csv_out -Encoding Default
复制代码

TOP

回复 1# 78785858


    如需上传附件,请用阿里云盘或百度网盘。
【批处理在线视频分享】http://bbs.bathome.net/thread-31727-1-1.html
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html

我帮忙写的代码不需要付钱,也不用找我要支付宝或微信账号。如果一定要给,请在群里给大家吧。

TOP

本帖最后由 zaqmlp 于 2022-4-16 00:26 编辑
  1. <# :
  2. cls&echo off&cd /d "%~dp0"
  3. powershell -NoProfile -ExecutionPolicy bypass "Get-Content -literal \"%~f0\"|out-string|Invoke-Expression"
  4. pause
  5. exit
  6. #>
  7. $oldcsvfile="原文件.csv";
  8. $newcsvfile="结果.csv";
  9. $column=@('7','24') ;
  10. $len=6;
  11. if(-not (test-path -literal $oldcsvfile)){write-host ('"'+$oldcsvfile+'" not fount');exit;}
  12. $enc=[Text.Encoding]::GetEncoding('GB2312');
  13. $text=[IO.File]::ReadAllText($oldcsvfile, $enc).trim() -split '\r\n';
  14. $csv=$text[1..($text.Count-1)]|%{$_ -replace '[\r\n]',''}|ConvertFrom-CSV -head @(1..[int]$column[1]|%{$_.ToString()})|select $column;
  15. $dic=New-Object 'System.Collections.Generic.Dictionary[string, object]';
  16. foreach($col in $csv){
  17.     $name=$col.($column[0]);
  18.     $detail='';
  19.     $reg='^.{1,'+$len.toString()+'}';
  20.     $m=[regex]::match($col.($column[1]), $reg);
  21.     if($m.Success){
  22.         $detail=$m.groups[0].value;
  23.         if(-not $dic.ContainsKey($detail)){
  24.             [System.Collections.ArrayList]$arr=@();
  25.             $dic.add($detail, @(0, $arr));
  26.         }
  27.         $dic[$detail][0]++;
  28.         if($dic[$detail][1] -notcontains $name){
  29.             [void]$dic[$detail][1].add($name);
  30.         }
  31.     }
  32. }
  33. [System.Collections.ArrayList]$s=@();
  34. $title=@('明细', '数量', '名称') -join ',';
  35. [void]$s.add($title);
  36. foreach($k in ($dic.Keys|sort {$dic[$_][0]} -Descending)){
  37.     for($i=0;$i -lt $dic[$k][1].count;$i++){
  38.         $line=@($k, $dic[$k][0].ToString(), $dic[$k][1][$i]) -join ',';
  39.         [void]$s.add($line);
  40.     }
  41. }
  42. [IO.File]::WriteAllLines($newcsvfile, $s, $enc);
复制代码
提供bat代写,为你省时省力省事,支付宝扫码头像支付
微信: unique2random

TOP

回复 2# went


        + CategoryInfo          : InvalidOperation: ( [],RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

使用“2”个参数调用“Substring”时发生异常:“索引和长度必须引用该字符串内的位置。
参数名: length”
所在位置 行:15 字符: 9
+         @{'a'=$arr[$col1-1];'b'=$arr[$col2-1].SubString(0,6)}
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ArgumentOutOfRangeException

好多报错

TOP

回复 4# zaqmlp


   明细不是第7列    名称读取不是第24列,大神麻烦再看看

TOP

zaqmlp 发表于 2022-4-13 22:55



    明细不是第7列    名称读取不是第24列,大神麻烦再看看

TOP

回复 6# 78785858


    什么意思?加我微信或网盘分享csv文件
提供bat代写,为你省时省力省事,支付宝扫码头像支付
微信: unique2random

TOP

链接: https://pan.baidu.com/s/1U0yNQqdJAdoLHh3NsKrOVA?pwd=n83d 提取码: n83d

原始文件在这里

TOP

回复  78785858


    什么意思?加我微信或网盘分享csv文件
zaqmlp 发表于 2022-4-13 23:39



    加了

TOP

回复 9# 78785858

已修改,
你的原文件24列只有4位,结果却是6位,按实际自行修改$len=4;
提供bat代写,为你省时省力省事,支付宝扫码头像支付
微信: unique2random

TOP

本帖最后由 went 于 2022-4-13 23:54 编辑

回复 5# 78785858


    已改,编码要使用ansi

TOP

回复 2# went


   感谢大侠分享, 没想到 &{} 还可以嵌套, PS碉堡了
本人所发所有贴子或代码, 诸大侠若认为有改进之处,请不吝赐教,感激不尽!

TOP

返回列表