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

[文本处理] chatgtp写的批处理统计第一列重复3次或以上,错误在哪呢?

data.txt中有许多行数据,每一行数据被空格分成前后两个部分,请你写一个批处理,逐一比较每一行数据的空格前的部分,如果某一行数据的空格前的部分,与其他行的空格前的部分重复次数≥3,则把此行空格后的部分保存到newdata.txt

上图是data.txt中的部分内容
下图是newdata.txt中的部分内容

上图是data.txt中的部分内容,下图是运行批处理后newdata.txt中应该呈现的数据
即空格前数据重复了三次的数据的空格后的部分
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. rem 读取文件中的每一行数据
  4. for /f "tokens=1,* delims= " %%a in (data.txt) do (
  5.     set "count=0"
  6.     rem 统计空格前的部分出现的次数
  7.     for /f "tokens=1,* delims= " %%c in (data.txt) do (
  8.      if "%%c"=="%%a" set /a count+=1
  9.     )
  10.     rem 判断是否出现次数≥3
  11.     if !count! geq 3 (
  12.      echo %%b>>newdata.txt
  13.     )
  14. )
  15. echo 执行完毕,结果保存在 newdata.txt 文件中。
  16. 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`:结束延迟环境变量扩展。

这是另一个解答
以下是一个批处理脚本,适用于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` 文件中。

TOP

第三个解答
你好,我可以为你提供一些帮助。我可以提供一段批处理代码,用于比较`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
)

TOP

回复 1# 520pcl


请给一个真实的例子说明一下你的需求吧,比如操作之前是怎样的,操作之后变成啥样?
如果需要上传文件,可以用阿里云盘或百度网盘。

如果需要上传截图,可以找个图床,例如:
http://bbs.bathome.net/thread-60985-1-1.html
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

本帖最后由 520pcl 于 2023-3-17 17:35 编辑


上图是data.txt中的部分内容
下图是newdata.txt中的部分内容

上图是data.txt中的部分内容,下图是运行批处理后newdata.txt中应该呈现的数据
即空格前数据重复了三次的数据的空格后的部分

TOP

是连续三次还是累计三次?

TOP

回复 6# jyswjjgdwtdtj


累计三次及三次以上,无需连续

TOP

我帮你试了前两个代码,都是没问题的。

注意下data.txt的编码格式和换行符吧,可以同时把编码格式改为ansi,换行符改为CR+LF试试
bat小白,请多指教!谢谢!

TOP

回复 8# 77七
谢谢,问题解决了,现在就是生成的newdata.txt中,插有几行“ECHO 处于关闭状态”的提示,不过这个问题不大,替换掉就好了
我把data.txt中的数据复制到为知笔记,然后复制回来,问题就解决了,我习惯用为知笔记解决编码格式问题
看来chatgtp还是很强大的,如果你需要测试chatgtp编写批处理的能力,回复我,我给你分享一个免费使用chatgtp的网址,无需fq

TOP

回复 9# 520pcl
第三个解答其实是另一个国外人工智能的解答,不是chatgtp的回答

TOP

回复 9# 520pcl


  
  1. echo.>newdata.txt
复制代码
代码开头可以换成这样,就不会有提示了
bat小白,请多指教!谢谢!

TOP

好的,免费chatgtp网址 https://www.cx32.com/ 但这个是3.0版 不是最新的4.0版本

TOP

回复 9# 520pcl


echo %%b>>newdata.txt
改成这样试试:
echo,%%b>>newdata.txt
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 2# 520pcl


echo !value! >> newdata.txt
这种写法会导致:
1、行尾有多余的空格
2、变量值遇到 on 或 off 等关键字的时候会出错

改成这样比较好:
>> newdata.txt echo,!value!
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

最起码现在来说,我还是不太相信chatgtp,还是自己写代码比较放心。如果不在乎文本原来的顺序的话:
  1. @echo off
  2. for /f "tokens=1*" %%i in ('type data.txt^|sort') do (
  3.     if "!str!"=="%%i" (
  4.         set /a n+=1
  5.         set _!n!=%%j
  6.     ) else (
  7.         if !n! geq 3 (
  8.             (for /f "tokens=1* delims==" %%a in ('set _') do (
  9.                 echo,%%b
  10.             )
  11.             echo,)>>newdata.txt
  12.             endlocal
  13.         )
  14.         setlocal enabledelayedexpansion
  15.         set n=1
  16.         set _1=%%j
  17.     )
  18.     set str=%%i
  19. )
  20. pause
复制代码

TOP

返回列表