Board logo

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

作者: haichuan5121    时间: 2024-8-16 11:15     标题: 求助批处理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
作者: qixiaobin0715    时间: 2024-8-16 11:40

列与列之间是以逗号分隔的吧?
作者: 77七    时间: 2024-8-16 14:27

把楼主的文本复制到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
复制代码

作者: 77七    时间: 2024-8-16 14:31

  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
复制代码

作者: haichuan5121    时间: 2024-8-16 15:20

回复 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
作者: haichuan5121    时间: 2024-8-16 15:21

回复 2# qixiaobin0715


    对的
作者: 77七    时间: 2024-8-16 15:25

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

回复 5# haichuan5121


   我打错了,echo off,打成0ff了,测试时两个脚本写一起了,没发现。
作者: aloha20200628    时间: 2024-8-16 15:29

回复 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
复制代码

作者: qixiaobin0715    时间: 2024-8-16 15:57

本帖最后由 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
复制代码

作者: haichuan5121    时间: 2024-8-16 16:50

回复 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
作者: haichuan5121    时间: 2024-8-16 16:58

回复 9# qixiaobin0715


    一个文件执行是OK的结果  批次多个就不行了 *.csv
作者: qixiaobin0715    时间: 2024-8-16 17:04

发现求助帖提供的样本不典型,总是与实际相差甚远,怪不得代码要一遍遍重写。
作者: qixiaobin0715    时间: 2024-8-16 17:07

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

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

回复 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
复制代码

作者: 77七    时间: 2024-8-16 17:36

回复 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 (
作者: 77七    时间: 2024-8-16 17:41

回复 10# haichuan5121


   重定向 > 也改了吧...如果需要追加,把结果放到其它目录去。
作者: haichuan5121    时间: 2024-8-19 10:36

回复 12# qixiaobin0715


    大哥误会了;小弟所有文本格式都是统一的;单文本就是TXT小插件转换后的CSV;样本完全一致; 需要执行的文本是多个类似CSV文件,不是单个CSV长文本,每个文本需要保留的是文本带数字部分前三列且不重复;
比如 A文本数字编号1-6有两遍 只保留一遍就行;第B文本和A不冲突,B文本也仅保留1-6标号的前三列;B文本和A文本之间的重复不需要去;
A文件内容
Function        SHEET       
Curr.Range        AUTO       
Volt Range        AUTO       
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
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
B文件内容
Function        SHEET       
Curr.Range        AUTO       
Volt Range        AUTO       
No        X-Point        Y-Point
1        34.2        23.8
2        240.8        26.8
3        428.3        15.8
4        678.5        16.8
5        875.4        16.8
6        1038.1        16.8
1        34.2        23.8
2        240.8        26.8
3        428.3        15.8
4        678.5        16.8
5        875.4        16.8
6        1038.1        16.8

结果内容替换或新生产都行
        No        X-Point        Y-Point
A        1        80.2        16.8
A        2        270.8        16.8
A        3        448.3        16.8
A        4        678.5        16.8
A        5        875.4        16.8
A        6        1038.1        16.8
        No        X-Point        Y-Point
B        1        34.2        23.8
B        2        240.8        26.8
B        3        428.3        15.8
B        4        678.5        16.8
B        5        875.4        16.8
B        6        1038.1        16.8
作者: qixiaobin0715    时间: 2024-8-19 10:57

不是大家误会你了,而是你自说自话,自己没有说清楚,每次描述都不一样。让你上传文件,好像有多费劲似的,表达又不完整:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /f "delims=" %%a in ('dir /b /a-d *.csv') do (
  4.     echo,Filename,No,X-Point,Y-Point
  5.     set n=1
  6.     for /f "tokens=1-3 delims=," %%i in ('type "%%a"') do (
  7.         if !n! equ %%i (
  8.             echo,%%~na,%%i,%%j,%%k
  9.             set /a n+=1
  10.         )
  11.     )
  12. ))>out.csv
  13. pause
复制代码

作者: czjt1234    时间: 2024-8-19 10:58

A文件内容
Function        SHEET        
Curr.Range        AUTO        
Volt Range        AUTO        
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
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

这个每列之间的分隔符,是若干个空格,还是tab,还是逗号

如果是逗号,为什么要把逗号去掉再发出来?

生成的结果文件的分隔符,需要是若干个空格,还是tab,还是逗号?
作者: czjt1234    时间: 2024-8-19 11:00

光是猜你的源文件的格式就费老大的劲
甚至有时候还有文件编码格式是gbk还是utf8的
你弄个百度网盘,把两三个原文件,和需要的结果文件,放网盘,不行么?
作者: haichuan5121    时间: 2024-8-19 11:36

回复 18# qixiaobin0715


    跪谢大神   这次是想要的结果
作者: haichuan5121    时间: 2024-8-19 11:39

回复 20# czjt1234


    不好意思大哥们  ,公司内网文件加密了,限制复制和上传文件了,要么也不会让大哥们各种猜测了;谢谢各位  18楼大神已经给解了




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