返回列表 发帖

【已解决】【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、实现代码

回复 2# went


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

TOP

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

回复 5# 78785858


    已改,编码要使用ansi

TOP

回复 9# 78785858

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

TOP

回复  78785858


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



    加了

TOP

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

原始文件在这里

TOP

回复 6# 78785858


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

TOP

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



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

TOP

回复 4# zaqmlp


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

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

本帖最后由 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);COPY
提供bat代写,为你省时省力省事,支付宝扫码头像支付
微信: unique2random

TOP

回复 1# 78785858


    如需上传附件,请用阿里云盘或百度网盘。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

本帖最后由 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 DefaultCOPY

TOP

返回列表