标题: 【已解决】【50元求助】bat处理csv指定列, [打印本页]
作者: 78785858 时间: 2022-4-13 21:57 标题: 【已解决】【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 22:46
本帖最后由 went 于 2022-4-13 23:51 编辑
test.bat
bat和csv文件都保存ansi编码- #&cls&@cd /d "%~dp0"&powershell -c "Get-Content '%~0' | Out-String | Invoke-Expression" &pause&exit
- cls
- #输入csv文件
- $csv_in = '需要处理的.csv'
- #输出csv文件
- $csv_out = '1.csv'
- #名称明细列号
- $col1 = 7
- $col2 = 24
- &{
- '明细,数量,名称'
- &{
- Get-Content $csv_in | Select-Object -Skip 1 | foreach {
- $arr = $_ -replace ',,',',0,' -split ','
- @{'a'=$arr[$col1-1];'b'=$arr[$col2-1] -replace '(.*$',''}
- }
- } | Group-Object { $_.b } | Sort-Object { $_.Count } -Descending | foreach {
- $__ = $_
- $_.Group | foreach {
- '{0},{1},{2}' -f $__.Name,$__.Count,$_.a
- }
- }
- } | Select-Object -Unique | Out-File $csv_out -Encoding Default
复制代码
作者: Batcher 时间: 2022-4-13 22:47
回复 1# 78785858
如需上传附件,请用阿里云盘或百度网盘。
作者: zaqmlp 时间: 2022-4-13 22:55
本帖最后由 zaqmlp 于 2022-4-16 00:26 编辑
- <# :
- cls&echo off&cd /d "%~dp0"
- powershell -NoProfile -ExecutionPolicy bypass "Get-Content -literal \"%~f0\"|out-string|Invoke-Expression"
- pause
- exit
- #>
- $oldcsvfile="原文件.csv";
- $newcsvfile="结果.csv";
- $column=@('7','24') ;
- $len=6;
- if(-not (test-path -literal $oldcsvfile)){write-host ('"'+$oldcsvfile+'" not fount');exit;}
- $enc=[Text.Encoding]::GetEncoding('GB2312');
- $text=[IO.File]::ReadAllText($oldcsvfile, $enc).trim() -split '\r\n';
- $csv=$text[1..($text.Count-1)]|%{$_ -replace '[\r\n]',''}|ConvertFrom-CSV -head @(1..[int]$column[1]|%{$_.ToString()})|select $column;
- $dic=New-Object 'System.Collections.Generic.Dictionary[string, object]';
- foreach($col in $csv){
- $name=$col.($column[0]);
- $detail='';
- $reg='^.{1,'+$len.toString()+'}';
- $m=[regex]::match($col.($column[1]), $reg);
- if($m.Success){
- $detail=$m.groups[0].value;
- if(-not $dic.ContainsKey($detail)){
- [System.Collections.ArrayList]$arr=@();
- $dic.add($detail, @(0, $arr));
- }
- $dic[$detail][0]++;
- if($dic[$detail][1] -notcontains $name){
- [void]$dic[$detail][1].add($name);
- }
- }
- }
- [System.Collections.ArrayList]$s=@();
- $title=@('明细', '数量', '名称') -join ',';
- [void]$s.add($title);
- foreach($k in ($dic.Keys|sort {$dic[$_][0]} -Descending)){
- for($i=0;$i -lt $dic[$k][1].count;$i++){
- $line=@($k, $dic[$k][0].ToString(), $dic[$k][1][$i]) -join ',';
- [void]$s.add($line);
- }
- }
- [IO.File]::WriteAllLines($newcsvfile, $s, $enc);
复制代码
作者: 78785858 时间: 2022-4-13 23:36
回复 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
好多报错
作者: 78785858 时间: 2022-4-13 23:37
回复 4# zaqmlp
明细不是第7列 名称读取不是第24列,大神麻烦再看看
作者: 78785858 时间: 2022-4-13 23:37
zaqmlp 发表于 2022-4-13 22:55
明细不是第7列 名称读取不是第24列,大神麻烦再看看
作者: zaqmlp 时间: 2022-4-13 23:39
回复 6# 78785858
什么意思?加我微信或网盘分享csv文件
作者: 78785858 时间: 2022-4-13 23:40
链接: https://pan.baidu.com/s/1U0yNQqdJAdoLHh3NsKrOVA?pwd=n83d 提取码: n83d
原始文件在这里
作者: 78785858 时间: 2022-4-13 23:47
回复 78785858
什么意思?加我微信或网盘分享csv文件
zaqmlp 发表于 2022-4-13 23:39
加了
作者: zaqmlp 时间: 2022-4-13 23:50
回复 9# 78785858
已修改,
你的原文件24列只有4位,结果却是6位,按实际自行修改$len=4;
作者: went 时间: 2022-4-13 23:52
本帖最后由 went 于 2022-4-13 23:54 编辑
回复 5# 78785858
已改,编码要使用ansi
作者: 5i365 时间: 2022-4-14 10:00
回复 2# went
感谢大侠分享, 没想到 &{} 还可以嵌套, PS碉堡了
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |