找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
楼主: 5i365

[问题求助] PowerShell提取txt中的数字后对比csv中的序号所在列,然后导出新csv文件

[复制链接]
 楼主| 发表于 2022-1-12 16:26:04 | 显示全部楼层
回复 15# idwma

好的, 多谢, 另外目前代码中 下面这行代码, 是搜索所有的这些txt文件中的数字,对比a.csv的第一列的数字后,然后输出一个b.csv, 我现在想: 包含*原唱*.txt中的文件夹中的数字对比a.csv的第一列的数字后,输出为 原唱.csv, 包含*伴奏*.txt中的文件夹中的数字对比a.csv的第一列的数字后,输出为 伴奏.csv, 包含*歌词*.txt中的文件夹中的数字对比a.csv的第一列的数字后,输出为 歌词.csv
dir -recu * -inc *原唱*.txt,*伴奏*.txt,*歌词*.txt

    https://wss1.cn/f/7cfkwglj3kw 复制链接到浏览器打开
发表于 2022-1-12 18:30:19 | 显示全部楼层
回复 16# 5i365
  1. #@&cls&powershell -version 2.0 "type '%~0'|out-string|iex"&pause&exit
  2. $a=@{}
  3. $f=gc a.csv
  4. $f|%{
  5.     $z=$_ -replace '^(\d+).*','$1'
  6.     if (!($a.ContainsKey($z))){$a.$z=$_}
  7. }
  8. $b=@{}
  9. $d=@{}
  10. dir -recu * -inc *原唱*.txt,*伴奏*.txt,*歌词*.txt|%{
  11.     if($_ -match '(原唱|伴奏|歌词)'){$c=$Matches[0]}
  12.     foreach($i in gc $_){
  13.         if($i -match '\d'){
  14.             $z=$i -replace '\D*(\d+)\D*','$1'
  15.             if(!($b.ContainsKey($z))){$b.$z=$a.$z;$d.$c+=@($a.$z)}
  16.         }
  17.     }
  18.     if($b.ContainsKey($z)){sc $_ ''}
  19.     $z=-1
  20. }
  21. $d.keys|%{sc $($_+'.csv') ($f[0],($d.$_|sort{[int]($_ -split ',')[0]}))}
复制代码

评分

参与人数 1技术 +1 收起 理由
5i365 + 1 大侠写的PS和CMD太精炼了, 得细细品, 感谢!

查看全部评分

 楼主| 发表于 2022-1-13 14:55:16 | 显示全部楼层
回复 17# idwma


    大侠, 刚刚在WIN10上运行直接提示 让装相对应的.net, 应该是 第一行的 限定版本导致的, 而win10上没有.net 2

我把版本号删了, 运行不成功, 也报错, 以前的那个批处理 就不用限定PS版本, 只是把所有的数字都输出到一个b.csv中了
发表于 2022-1-13 15:54:03 | 显示全部楼层
回复 18# 5i365


    开win10试了一下自带的5.1也可以的
 楼主| 发表于 2022-1-13 18:38:41 | 显示全部楼层
本帖最后由 5i365 于 2022-1-13 18:39 编辑

回复 19# idwma


    在我的那个压缩包里面的示例执行, 把版本删了可以执行, 但是我改了一下dir路径, 和过滤的文件名的文字, 执行就出错了, 多亏有备份, 因为有些txt文件会被清空

如果不清空原txt, 只导出独立的文本, 需要注释哪行代码?
发表于 2022-1-13 19:11:13 | 显示全部楼层
回复 20# 5i365


    18
19
 楼主| 发表于 2022-1-21 10:53:34 | 显示全部楼层
本帖最后由 5i365 于 2022-1-21 19:07 编辑

回复 21# idwma


您好, 现在有两个问题想请教
1.有时获取的.txt文件中,例如下面的示例, 数字并不全是在开头, 而是在一行的中间[如下面的32]或结尾[如下面的28], 怎样设置三个筛选开关分别对应三种情况?  例如, 我只想筛选结尾的数字时就将其开关打开
--------------------------------------------------------------------
58有问题
80伴奏有问题 需要重新下载正确的
正确的32, 错误的28
132没有伴奏

2.txt文件, 可能在不同的文件夹中, 想在导出的csv文件名前,加上其所在的文件夹名
例如导出的   歌词.csv  文件, 他是筛选的 1号 文件夹下的, 名字就改为   1号_歌词.csv
--------------------------------------------------------------------------------------------------------------------------------------
要修改的代码, 及文件 https://send.cm/d/84IN
  1. #@&cls&powershell -version 2.0 "type '%~0'|out-string|iex"&pause&exit
  2. $a=@{}
  3. $f=gc 歌单.csv -Encoding UTF8
  4. $f|%{
  5.     $z=$_ -replace '^(\d+).*','$1'
  6.     if (!($a.ContainsKey($z))){$a.$z=$_}
  7. }
  8. $b=@{}
  9. $d=@{}
  10. dir ".\任务" -recu * -inc *原唱*.txt,*伴奏*.txt,*歌词*.txt|%{
  11.     if($_ -match '(原唱|伴奏|歌词)'){$c=$Matches[0]}
  12.     foreach($i in gc $_){
  13.         if($i -match '\d'){
  14.             $z=$i -replace '\D*(\d+)\D*','$1'
  15.             if(!($b.ContainsKey($z))){$b.$z=$a.$z;$d.$c+=@($a.$z)}
  16.         }
  17.     }
  18.     #if($b.ContainsKey($z)){sc $_ ''} #清空
  19.     #$z=-1 #清空
  20. }
  21. $d.keys|%{sc -Encoding UTF8 $($_+'.csv') ($f[0],($d.$_|sort{[int]($_ -split ',')[0]}))}
复制代码
发表于 2022-1-21 15:17:30 | 显示全部楼层
回复 22# 5i365
  1. #@&cls&powershell -version 2.0 "type '%~0'|out-string|iex"&pause&exit
  2. $r='^(\d+).+'                #1
  3. #$r='\D+(\d+)\D+'        #2
  4. #$r='\D+(\d+)$'                #3

  5. $a=@{}
  6. $f=gc 歌单.csv -Encoding UTF8
  7. $f|%{
  8.     $z=$_ -replace '^(\d+).*','$1'
  9.     if (!($a.ContainsKey($z))){$a.$z=$_}
  10. }
  11. $b=@{}
  12. $d=@{}
  13. dir ".\任务" -recu * -inc *原唱*.txt,*伴奏*.txt,*歌词*.txt|%{
  14.     if($_ -match '(原唱|伴奏|歌词)'){$c=$Matches[0]}
  15.     foreach($i in gc $_){
  16.         if($i -match '\d'){
  17.             $z=$i -replace $r,'$1'
  18.             if(!($b.ContainsKey($z))){$b.$z=$a.$z;$d.$c+=@($a.$z)}
  19.         }
  20.     }
  21.     #if($b.ContainsKey($z)){sc $_ ''} #清空
  22.     #$z=-1 #清空
  23. }
  24. $d.keys|%{sc -Encoding UTF8 $($_+'.csv') ($f[0],($d.$_|sort{[int]($_ -split ',')[0]}))}
复制代码
 楼主| 发表于 2022-1-21 19:07:00 | 显示全部楼层
本帖最后由 5i365 于 2022-1-21 19:09 编辑

回复 23# idwma


    刚试了一下, 第一条OK了, 下面这条没有
txt文件, 可能在不同的文件夹中, 想在导出的csv文件名前,加上其所在的文件夹名
例如导出的   歌词.csv  文件, 他是筛选的 1号 文件夹下的, 名字就改为   1号_歌词.csv
示例中, 有  1号  和  2号  两个文件夹,
1号 中提取其下txt中的数字后, 生成的csv文件, 带上前缀  1号_
2号 中提取其下txt中的数字后, 生成的csv文件, 带上前缀  2号_
发表于 2022-1-21 20:32:27 | 显示全部楼层
本帖最后由 idwma 于 2022-1-22 00:13 编辑

回复 24# 5i365
  1. #@&cls&powershell -version 2.0 "type '%~0'|out-string|iex"&pause&exit
  2. #$r='^(\d+).*'                #1
  3. $r='^\D+(\d+)\D'        #2
  4. #$r='\D+(\d+)$'                #3

  5. $a=@{}
  6. $f=gc 歌单.csv -Encoding UTF8
  7. $f|%{
  8.     $z=$_ -replace '^(\d+).*','$1'
  9.     if (!($a.ContainsKey($z))){$a.$z=$_}
  10. }
  11. $d=@{}
  12. dir ".\任务" -recu * -inc *原唱*.txt,*伴奏*.txt,*歌词*.txt|%{
  13.     if($_ -match '(原唱|伴奏|歌词)'){$c=$($_.fullname -replace '^.*?([^\\]*)\\[^\\]*$','$1')+'_'+$Matches[0]}
  14.     foreach($i in gc $_){
  15.         if($i -match $r){
  16.             $z=$matches[1]
  17.             if($a.ContainsKey($z)){$d[$c]+=@($a.$z)}
  18.         }
  19.     }
  20. }
  21. $d.keys|%{sc -Encoding UTF8 $($_+'.csv') ($f[0],($d.$_|sort{[int]($_ -split ',')[0]}))}
复制代码
 楼主| 发表于 2022-1-22 06:54:23 | 显示全部楼层
回复 26# 5i365


    23楼的, 22,23行清空已筛选的的txt文件代码, 加在哪里?
发表于 2022-1-22 13:36:01 | 显示全部楼层
回复 26# 5i365


    $b改成$a还是放在原来的地方
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 04:25 , Processed in 0.021289 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表