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

[文本处理] 求助批处理CSV文本去重复,仅保留数字开头的行前三列

CSV格式的怎么搞定;也是需要去重,需要第17行开始前三列一致的行去重,例如源文件后面1-13前三列和前面1-13前三列是重复的就不提取,
即仅保留以数字1-24数字开头的行,数字行不一定是24但在50个以内;



源内容是
bbb                              
Slot No        1                       
Date        0.00E+00                       
Lot ID        0.00E+00                       
Operator ID        AGV                                       
Cassette ID        0.00E+00                       
Retry        0                       
Recipe ID        23s                                       
Std Min Value        0.00E+00                       
Std Max Value        1.00E+09                       
Ctl Min Value        0.00E+00                       
Ctl Max Value        1.00E+09                       
Function        SHEET                           
Curr.Range        AUTO                              
Volt Range        AUTO                              
No        X-Point        Y-Point        Data        Result   
1        80.2        16.8        asd        OK   
2        270.8        16.8        asd        OK   
3        448.3        16.8        asd        OK   
4        678.5        16.8        asd        OK   
5        875.4        16.8        asd        OK   
6        1038.1        16.8        hdfg        OK   
7        1038.1        436.7        asd        OK   
8        875.4        436.7        asd        OK   
9        678.5        436.7        sc        OK   
10        448.3        436.7        asd        OK   
11        270.8        436.7        asd        OK   
12        80.2        436.7        asd        OK   
13        80.2        862.9        sfs        OK   
14        270.8        862.9        asd        OK  

15        448.3        862.9        asd        OK   
16        678.5        862.9        asd        OK   
17        875.4        862.9        asd        OK   
18        1038.1        862.9        asd        OK   
19        1038.1        1283.3        asd        OK   
20        875.4        1283.3        asd        OK   
21        678.5        1283.3        asd        OK   
22        448.3        1283.3        asd        OK   
23        270.8        1283.3        0.00E+00        OK   
24        80.2        1283.3        0.00E+00        OK   
MAX        3.59E+02
Slot No        2                     
Date        0.00E+00                       
Lot ID        0.00E+00                       
Operator ID        AGV                                       
Cassette ID        0.00E+00                       
Retry        0                       
Recipe ID        23s                                       
Std Min Value        0.00E+00                       
Std Max Value        1.00E+09                       
Ctl Min Value        0.00E+00                       
Ctl Max Value        1.00E+09                       
Function        SHEET                           
Curr.Range        AUTO                              
Volt Range        AUTO                              
No        X-Point        Y-Point        Data        Result   
1        80.2        16.8        asdw        OK   
2        270.8        16.8        asDd        OK   
3        448.3        16.8        aDsd        OK   
4        678.5        16.8        asd        OK   
5        875.4        16.8        asFd        OK   
6        1038.1        16.8        hdfg        OK   
7        1038.1        436.7        asd        OK   
8        875.4        436.7        aFsd        OK   
9        678.5        436.7        sc        OK   
10        448.3        436.7        asFd        OK   
11        270.8        436.7        asd        OK   
12        80.2        436.7        asSd        OK   
13        80.2        862.9        sSfs        OK   


结果保留
No        X-Point        Y-Point
1        80.2        16.8
2        270.8        16.8
3        448.3        16.8
4        678.5        16.8
5        875.4        16.8
6        1038.1        16.8
7        1038.1        436.7
8        875.4        436.7
9        678.5        436.7
10        448.3        436.7
11        270.8        436.7
12        80.2        436.7
13        80.2        862.9
14        270.8        862.9
15        448.3        862.9
16        678.5        862.9
17        875.4        862.9
18        1038.1        862.9
19        1038.1        1283.3
20        875.4        1283.3
21        678.5        1283.3
22        448.3        1283.3
23        270.8        1283.3
24        80.2        1283.3

列与列之间是以逗号分隔的吧?

TOP

把楼主的文本复制到1.txt,以下代码生成测试文件,方便各位测试
  1. @echo off
  2. cd /d "%~dp0"
  3. (for /f "delims=" %%a in ('more "1.txt"') do (
  4. set str=%%a
  5. setlocal enabledelayedexpansion
  6. set "str=!str:        =,!"
  7. echo=!str!
  8. endlocal
  9. ))>1.csv
  10. pause
复制代码
bat小白,请多指教!谢谢!

TOP

  1. @echo 0ff
  2. cd /d "%~dp0"
  3. (
  4. echo No,X-Point,Y-Point
  5. for /f "tokens=1-3 delims=," %%a in ('findstr /rbc:"[0-9][0-9]*,[0-9.][0-9.]*,[0-9.][0-9.]*" "1.csv"') do (
  6. if not defined _"%%a %%b %%c" (
  7. echo %%a,%%b,%%c
  8. set _"%%a %%b %%c"=1
  9. )
  10. )
  11. ) > "2.csv"
  12. pause
复制代码
bat小白,请多指教!谢谢!

TOP

回复 4# 77七


    第一个转CSV格式完全一致 ,但第二个验证结果
内容带执行过程了呢
No        X-Point        Y-Point
               
C:\Users\1111\Desktop\PI\验证>(if not defined _"1 80.2 16.8" (               
echo 1        80.2        16.8
set _"1 80.2 16.8"=1                
) )                
1        80.2        16.8
               
C:\Users\1111\Desktop\PI\验证>(if not defined _"2 270.8 16.8" (               
echo 2        270.8        16.8
set _"2 270.8 16.8"=1                
) )                
2        270.8        16.8
               
C:\Users\1111\Desktop\PI\验证>(if not defined _"3 448.3 16.8" (               
echo 3        448.3        16.8
set _"3 448.3 16.8"=1                
) )                
3        448.3        16.8
               
C:\Users\1111\Desktop\PI\验证>(if not defined _"3 448.3 16.8" (               
echo 4        678.5        16.8
set _"4 678.5 16.8"=1                
) )                
4        678.5        16.8

TOP

回复 2# qixiaobin0715


    对的

TOP

本帖最后由 77七 于 2024-8-16 15:27 编辑

回复 5# haichuan5121


   我打错了,echo off,打成0ff了,测试时两个脚本写一起了,没发现。
bat小白,请多指教!谢谢!

TOP

回复 1# haichuan5121

以下代码用一楼示例文件作为 “源文件.csv”
  1. @echo off &setlocal enabledelayedexpansion
  2. (echo,No X-Point Y-Point
  3. for /f "tokens=1-3 delims= " %%a in ('findstr /rbc:"[0-9][0-9]* " "源文件.csv" ') do (
  4. if %%a gtr !lastK! (echo,%%a %%b %%c&set "lastK=%%a")
  5. ))>"输出结果.csv" &endlocal&pause&exit/b
复制代码

TOP

本帖最后由 qixiaobin0715 于 2024-8-16 16:03 编辑

如果仅仅以顶楼提供的示范文件,这样也行吧:
  1. @echo off
  2. set n=1
  3. setlocal enabledelayedexpansion
  4. (for /f "tokens=1-3 delims=," %%i in (1.csv) do (
  5.     if !n! equ %%i (
  6.         echo,%%i,%%j,%%k
  7.         set /a n+=1
  8.     )
  9. ))>2.csv
  10. pause
复制代码

TOP

回复 7# 77七
测试结果 1-13编号后面重复的还会再出现一遍

    No        X-Point        Y-Point  
1 - 副本.csv:1        80.2        16.8
1 - 副本.csv:2        270.8        16.8
1 - 副本.csv:3        448.3        16.8
1 - 副本.csv:4        678.5        16.8
1 - 副本.csv:5        875.4        16.8
1 - 副本.csv:6        1038.1        16.8
1 - 副本.csv:7        1038.1        436.7
1 - 副本.csv:8        875.4        436.7
1 - 副本.csv:9        678.5        436.7
1 - 副本.csv:10        448.3        436.7
1 - 副本.csv:11        270.8        436.7
1 - 副本.csv:12        80.2        436.7
1 - 副本.csv:13        80.2        862.9
1 - 副本.csv:14        270.8        862.9
1 - 副本.csv:15        448.3        862.9
1 - 副本.csv:16        678.5        862.9
1 - 副本.csv:17        875.4        862.9
1 - 副本.csv:18        1038.1        862.9
1 - 副本.csv:19        1038.1        1283.3
1 - 副本.csv:20        875.4        1283.3
1 - 副本.csv:21        678.5        1283.3
1 - 副本.csv:22        448.3        1283.3
1 - 副本.csv:23        270.8        1283.3
1 - 副本.csv:24        80.2        1283.3
1 - 副本.csv:1        80.2        16.8
1 - 副本.csv:2        270.8        16.8
1 - 副本.csv:3        448.3        16.8
1 - 副本.csv:4        678.5        16.8
1 - 副本.csv:5        875.4        16.8
1 - 副本.csv:6        1038.1        16.8
1 - 副本.csv:7        1038.1        436.7
1 - 副本.csv:8        875.4        436.7
1 - 副本.csv:9        678.5        436.7
1 - 副本.csv:10        448.3        436.7
1 - 副本.csv:11        270.8        436.7
1 - 副本.csv:12        80.2        436.7
1 - 副本.csv:13        80.2        862.9
1.csv:1        80.2        16.8

TOP

回复 9# qixiaobin0715


    一个文件执行是OK的结果  批次多个就不行了 *.csv

TOP

发现求助帖提供的样本不典型,总是与实际相差甚远,怪不得代码要一遍遍重写。

TOP

本帖最后由 qixiaobin0715 于 2024-8-19 09:14 编辑

回复 11# haichuan5121
你多个文件是如何执行的,把你修改后的代码发上来看看。
或者把你执行的批处理和测试文件都发到网盘上,写清楚要得到的结果。让大家看看到底问题出在哪里。

TOP

回复 1# haichuan5121


    把csv源文件改名为a.csv,运行脚本后,结果为b.csv
  1. @echo off &setlocal enabledelayedexpansion
  2. (echo,No,X-Point,Y-Point
  3. for /f "tokens=1-3* delims=," %%a in ('findstr /rbc:"[0-9][0-9]*" "a.csv" ') do (
  4.     set v=%%a,%%b,%%c
  5.     if not defined !v! set !v!=s & echo !v!
  6. ))>b.csv
  7. start "" b.csv
  8. exit/b
复制代码

TOP

回复 10# haichuan5121


   
别乱改代码,多个文件查重。

for /f "tokens=1-3 delims=," %%a in ('type *.csv ^|findstr /rbc:"[0-9][0-9]*,[0-9.][0-9.]*,[0-9.][0-9.]*"') do (
bat小白,请多指教!谢谢!

TOP

返回列表