标题: [文本处理] chatgtp写的批处理统计第一列重复3次或以上,错误在哪呢? [打印本页]
作者: 520pcl 时间: 2023-3-17 16:57 标题: chatgtp写的批处理统计第一列重复3次或以上,错误在哪呢?
data.txt中有许多行数据,每一行数据被空格分成前后两个部分,请你写一个批处理,逐一比较每一行数据的空格前的部分,如果某一行数据的空格前的部分,与其他行的空格前的部分重复次数≥3,则把此行空格后的部分保存到newdata.txt
上图是data.txt中的部分内容
下图是newdata.txt中的部分内容
上图是data.txt中的部分内容,下图是运行批处理后newdata.txt中应该呈现的数据
即空格前数据重复了三次的数据的空格后的部分- @echo off
- setlocal enabledelayedexpansion
- rem 读取文件中的每一行数据
- for /f "tokens=1,* delims= " %%a in (data.txt) do (
- set "count=0"
- rem 统计空格前的部分出现的次数
- for /f "tokens=1,* delims= " %%c in (data.txt) do (
- if "%%c"=="%%a" set /a count+=1
- )
- rem 判断是否出现次数≥3
- if !count! geq 3 (
- echo %%b>>newdata.txt
- )
- )
- echo 执行完毕,结果保存在 newdata.txt 文件中。
- pause
复制代码
复制解释:
1. `setlocal enabledelayedexpansion`:启用延迟环境变量扩展,以便在循环中使用 `!` 操作符。
2. `for /f "tokens=1,* delims= " %%a in (data.txt) do`:逐行读取 `data.txt` 文件中的数据,使用空格作为分隔符,将每行数据分成两个部分,分别存储在 `%%a` 和 `%%b` 变量中。
3. `set "count=0"`:初始化计数器变量 `count`,用于统计空格前的部分出现的次数。
4. `for /f "tokens=1,* delims= " %%c in (data.txt) do`:再次循环读取 `data.txt` 文件中的数据,用于统计空格前的部分出现的次数。
5. `if "%%c"=="%%a" set /a count+=1`:如果当前行的空格前的部分与原始行的空格前的部分相同,则计数器加 1。
6. `if !count! geq 3 (`:判断计数器是否大于等于 3。
7. `echo %%b>>newdata.txt`:如果出现次数大于等于 3,将当前行的空格后的部分追加到 `newdata.txt` 文件中。
8. `pause`:程序暂停运行,等待用户按下任意键继续。
9. `setlocal`:结束延迟环境变量扩展。
作者: 520pcl 时间: 2023-3-17 16:59
这是另一个解答
以下是一个批处理脚本,适用于Windows操作系统,它可以实现你所要求的功能:
batch
@echo off
setlocal enabledelayedexpansion
if exist newdata.txt del newdata.txt
for /f "tokens=1,* delims= " %%a in (data.txt) do (
set "key=%%a"
set "value=%%b"
set "count=0"
for /f "tokens=1 delims= " %%x in ('findstr /b "!key! " data.txt') do (
set /a "count+=1"
)
if !count! GEQ 3 (
echo !value! >> newdata.txt
)
)
endlocal
将此脚本保存为 `process_data.bat`,确保它与 `data.txt` 文件位于相同的目录中。然后双击运行该批处理脚本,它将按照你的要求处理 `data.txt` 中的数据,并将结果保存到 `newdata.txt` 文件中。
作者: 520pcl 时间: 2023-3-17 17:02
第三个解答
你好,我可以为你提供一些帮助。我可以提供一段批处理代码,用于比较`data.txt`中每一行数据的空格前的部分,如果某一行数据的空格前的部分,与其他行的空格前的部分重复次数≥3,则新建`newdata.txt`,把此行空格后的部分保存到`newdata.txt`:
@echo off
setlocal EnableDelayedExpansion
REM 创建一个新文件newdata.txt
echo > newdata.txt
REM 读取data.txt文件
for /f "tokens=1,2* delims= " %%a in (data.txt) do (
set before=%%a
set after=%%b
REM 统计重复次数
set count=0
for /f "tokens=1* delims= " %%x in (data.txt) do (
if "%%x"=="!before!" set /a count+=1
)
REM 如果重复次数≥3,则把此行空格后的部分保存到newdata.txt
if !count! geq 3 echo !after! >> newdata.txt
)
作者: Batcher 时间: 2023-3-17 17:17
回复 1# 520pcl
请给一个真实的例子说明一下你的需求吧,比如操作之前是怎样的,操作之后变成啥样?
如果需要上传文件,可以用阿里云盘或百度网盘。
如果需要上传截图,可以找个图床,例如:
http://bbs.bathome.net/thread-60985-1-1.html
作者: 520pcl 时间: 2023-3-17 17:29
本帖最后由 520pcl 于 2023-3-17 17:35 编辑
上图是data.txt中的部分内容
下图是newdata.txt中的部分内容
上图是data.txt中的部分内容,下图是运行批处理后newdata.txt中应该呈现的数据
即空格前数据重复了三次的数据的空格后的部分
作者: jyswjjgdwtdtj 时间: 2023-3-17 17:46
是连续三次还是累计三次?
作者: 520pcl 时间: 2023-3-17 17:57
回复 6# jyswjjgdwtdtj
累计三次及三次以上,无需连续
作者: 77七 时间: 2023-3-17 18:04
我帮你试了前两个代码,都是没问题的。
注意下data.txt的编码格式和换行符吧,可以同时把编码格式改为ansi,换行符改为CR+LF试试
作者: 520pcl 时间: 2023-3-17 18:49
回复 8# 77七
谢谢,问题解决了,现在就是生成的newdata.txt中,插有几行“ECHO 处于关闭状态”的提示,不过这个问题不大,替换掉就好了
我把data.txt中的数据复制到为知笔记,然后复制回来,问题就解决了,我习惯用为知笔记解决编码格式问题
看来chatgtp还是很强大的,如果你需要测试chatgtp编写批处理的能力,回复我,我给你分享一个免费使用chatgtp的网址,无需fq
作者: 520pcl 时间: 2023-3-17 18:52
回复 9# 520pcl
第三个解答其实是另一个国外人工智能的解答,不是chatgtp的回答
作者: 77七 时间: 2023-3-17 19:20
回复 9# 520pcl
复制代码
代码开头可以换成这样,就不会有提示了
作者: 520pcl 时间: 2023-3-17 20:14
好的,免费chatgtp网址 https://www.cx32.com/ 但这个是3.0版 不是最新的4.0版本
作者: Batcher 时间: 2023-3-18 09:29
回复 9# 520pcl
echo %%b>>newdata.txt
改成这样试试:
echo,%%b>>newdata.txt
作者: Batcher 时间: 2023-3-18 09:33
回复 2# 520pcl
echo !value! >> newdata.txt
这种写法会导致:
1、行尾有多余的空格
2、变量值遇到 on 或 off 等关键字的时候会出错
改成这样比较好:
>> newdata.txt echo,!value!
作者: qixiaobin0715 时间: 2023-3-18 09:41
最起码现在来说,我还是不太相信chatgtp,还是自己写代码比较放心。如果不在乎文本原来的顺序的话:- @echo off
- for /f "tokens=1*" %%i in ('type data.txt^|sort') do (
- if "!str!"=="%%i" (
- set /a n+=1
- set _!n!=%%j
- ) else (
- if !n! geq 3 (
- (for /f "tokens=1* delims==" %%a in ('set _') do (
- echo,%%b
- )
- echo,)>>newdata.txt
- endlocal
- )
- setlocal enabledelayedexpansion
- set n=1
- set _1=%%j
- )
- set str=%%i
- )
- pause
复制代码
作者: 520pcl 时间: 2023-3-18 11:02
回复 13# Batcher
谢谢,改动后“ECHO 处于关闭状态”的提示没有了
作者: 520pcl 时间: 2023-3-18 11:05
回复 14# Batcher
好的,三个批处理其实都是可以运行的,第一个最快,第三个也比较快,第二个也比较慢,我就用第一个批处理
作者: 520pcl 时间: 2023-3-18 11:13
回复 15# qixiaobin0715
你这个也是可以完成任务的,但是空白行多了些,每三五行数据就有一个空白行,当然,替换一下就没问题了
作者: 520pcl 时间: 2023-3-18 11:23
回复 15# qixiaobin0715
是的,批处理代码的威力还是很大的,保守起见我是在另一台电脑上测试的,但chatgtp写批处理能力还是比较强的
作者: 77七 时间: 2023-3-18 11:44
本帖最后由 77七 于 2023-3-18 12:01 编辑
我还以为是开头的代码出现了提示
也可以试试直接计数,可能快一点- @echo off
- for /f "tokens=1-2" %%a in ('type "data.txt"') do (
- set /a #%%a+=1
- )
- setlocal enabledelayedexpansion
- for /f "tokens=1-2" %%a in ('type "data.txt"') do (
- if !#%%a! geq 3 (
- echo %%b
- )
- )>>newdata.txt
- endlocal
- pause
复制代码
如果有空白行,或者产生提示,还是建议查看一下编码格式和换行符,你复制到云笔记再粘贴回去不一定完美解决问题...
作者: 520pcl 时间: 2023-3-18 12:58
回复 20# 77七
谢谢,这段代码目前是最快的,为知笔记的特点是不管拷贝进去是什么格式,复制出来就是utf-8格式,之前不成功的时候我看了,data.txt就是ansi格式,后来去为知笔记复制回来其实是utf8,刚才试过了,data.txt是utf-8或ansi格式其实都可以运行。
其实这个代码很有用,data.txt是复制的excle中的某两个列,excle我不太熟,但好像用excle要实现这样的功能也是相当麻烦,干脆就保存为txt用批处理解决
作者: Batcher 时间: 2023-3-18 19:28
回复 17# 520pcl
第二个慢的原因是在for循环内部频繁调用外部命令findstr,每处理一行文本就会调用一次。
如果文本内容有很多行,这种慢会更加明显。
作者: 520pcl 时间: 2023-3-18 20:25
回复 22# Batcher
好像批处理都是些年龄较大的人在用,年轻人好像不怎么会用批处理,要么不知道,要么看不上,可能去学python去了,其实批处理更简洁方便啊,是不是这样
作者: Batcher 时间: 2023-3-19 10:51
回复 23# 520pcl
我了解到的情况:
1、本论坛有不少年轻人、学生。
2、如果一个人毕业之后别的什么都不会,Python掌握的非常好,可以找到一个挺好的对口的工作;如果一个人毕业之后别的什么都不会,BAT掌握的非常好,几乎找不到工作;如果一个人毕业之后可以通过其他技能找到工作,同时又懂BAT或Python,有助于提升薪资。
作者: qixiaobin0715 时间: 2023-3-20 08:15
本帖最后由 qixiaobin0715 于 2023-3-20 08:22 编辑
回复 18# 520pcl
你没明白空白行是我故意留下的吗?不同组别之间以空行隔开,不想要空行的话,可以将代码第11行中“echo,”删除即可。
如果chatgtp真的像你说的那样神奇,大家何必在这里啰嗦呢。
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |