Board logo

标题: [已解决]50人民币求助txt文本进行分类 [打印本页]

作者: 309597483@qq.co    时间: 2019-5-23 07:41     标题: [已解决]50人民币求助txt文本进行分类

本帖最后由 309597483@qq.co 于 2019-5-23 08:40 编辑

具体报酬:50元人民币
支付方式:支付宝,微信转账
联系方式:QQ 309597483
有效期限:2019年5月25日之前
需求描述:
作者: 309597483@qq.co    时间: 2019-5-23 07:42

[张三]
语文=85
数学=90
英语=22
化学=65
[李四]
语文=82
数学=75
英语=68
化学=88
[小明]
语文=70
数学=58
英语=96
化学=100
[小李]
语文=58
数学=77
英语=63
化学=64

---------这个是一个【成绩表.txt】文本,数据很多,暂举出4个例子
求助怎么进行批量分类,并输出对应的txt文本


------------------输出结果 1---------------------
[张三]
语文=85
[李四]
语文=82
[小明]
语文=70
[小李]
语文=58
--------输出保存为【语文.txt】

------------------输出结果 2---------------------
[张三]
数学=90
[李四]
数学=75
[小明]
数学=58
[小李]
数学=77
--------输出保存为【数学.txt】

------------------输出结果 3---------------------
[张三]
英语=22
[李四]
英语=68
[小明]
英语=96
[小李]
英语=63
--------输出保存为【英语.txt】

------------------输出结果 4---------------------
[张三]
化学=65
[李四]
化学=88
[小明]
化学=100
[小李]
化学=64
--------输出保存为【化学.txt】
作者: zaqmlp    时间: 2019-5-23 08:15

  1. @echo off
  2. set info=互助互利,支付宝扫码头像,感谢赞助
  3. rem 有问题,可加QQ956535081及时沟通
  4. title %info%
  5. cd /d "%~dp0"
  6. set "file=成绩表.txt"
  7. for /f "skip=1 delims=" %%a in ('type "%file%"') do (
  8.     set "line1=%%a"
  9.     setlocal enabledelayedexpansion
  10.     if "!line1:~,1!" equ "[" goto end
  11.     endlocal
  12.     for /f "tokens=1* delims==" %%b in ("%%a") do (
  13.         echo;%%b
  14.         (for /f "delims=" %%e in ('type "%file%"') do (
  15.             set "line2=%%e"
  16.             setlocal enabledelayedexpansion
  17.             if "!line2:~,1!" equ "[" echo;%%e
  18.             for /f "tokens=1* delims==" %%g in ("!line2!") do (
  19.                 if "%%b" equ "%%g" echo;!line2!
  20.             )
  21.             endlocal
  22.         ))>"%%b.txt"
  23.     )
  24. )
  25. :end
  26. echo;%info%
  27. pause
复制代码

作者: 523066680    时间: 2019-5-23 12:06

早上处理的,题主实际资料要多一些,改动不大。
  1. use Encode;
  2. use File::Slurp;
  3. my @text = read_file("src.txt");
  4. my %main;
  5. my $ref;
  6. my @order;
  7. my %item;
  8. for my $e ( @text )
  9. {
  10.     $e=~s/\r?\n$//;
  11.     if ( $e =~/^\[/ ) {
  12.         $main{$e} = {};
  13.         push @order, $e;
  14.         $ref = $main{$e};
  15.     } else {
  16.         if ($e =~ /^(.*)=/) {  # 可能有空白项
  17.             $item{$1} = 1;
  18.             $ref->{$1} = $e;
  19.         }
  20.     }
  21. }
  22. # 按 item 处理
  23. for my $type ( keys %item ) {
  24.     my $fname = $type .".txt";
  25.     my $buff = "";
  26.     for my $name ( @order )
  27.     {
  28.         next unless (exists $main{$name}->{$type});
  29.         $buff .= $name ."\r\n". $main{$name}->{$type} ."\r\n";
  30.     }
  31.     write_file( $fname, {binmode=>":raw"}, $buff );
  32. }
复制代码
-------------------------------
已支持论坛 10 元 (支付宝)
流水号 20190523200040011100480062006406
作者: Batcher    时间: 2019-5-23 12:20

回复 4# 523066680


    确认收到。感谢你对论坛的支持!捐助分已添加。
作者: amwfjhh    时间: 2019-5-23 13:01

本帖最后由 amwfjhh 于 2019-5-23 13:45 编辑
zaqmlp 发表于 2019-5-23 08:15



    Great!!!
作者: ivor    时间: 2019-5-23 13:52

本帖最后由 ivor 于 2019-5-23 19:33 编辑
  1. [regex]::Matches((Get-Content .\成绩表.txt -Raw -Encoding UTF8),'\[[\s\S]+?(?=\[|$)') | %{
  2.     $name = [regex]::Matches($_,"\[.*\]")
  3.     $score = [regex]::Matches($_,".*=.*")
  4.     foreach($s in $score){
  5.         $fileName = [regex]::Matches($s,".+(?==)")
  6.         Write-Output $name.Value >> $fileName".txt"
  7.         Write-Output $s.Value >>$fileName".txt"
  8.     }
  9. }
复制代码
感谢amwfjhh:指正,已修复“最后一个人的数据”的问题




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