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

[文本处理] [已解决]字符串组合问题(望指正)

[复制链接]
发表于 2017-10-16 03:54:01 | 显示全部楼层 |阅读模式
本帖最后由 冰剑 于 2017-10-17 16:10 编辑

源文件内容示例:
第一行字符串
第二行字符串
第三行字符串
........

要生成的文件内容新建文本文件abcd.txt
.STRINGS
$str[1] = "第一行字符串"
$str[2] = "第二行字符串"
$str[3] = "第三行字符串"
......
.END
  1. SET /P file=请将需要处理的文件拖入本窗口
  2. SET /P init=请输入生成数组起始值
  3. CLS
  4. set str=.STRINGS
  5. ECHO %str%>abcd.txt
  6. SET str1=^$str[
  7. SET /a str2=%init%
  8. SET str3=^] = "
  9. SET str4=^"
  10. for /f %%i in (%file%) do (
  11. SET "strall=%str1%%str2%%str3%!%%i!%str4%"
  12. ECHO !strall!>>abcd.txt
  13. SET /a str2=%str2%+1
  14. )
  15. SET str=.END
  16. ECHO %str%>>abcd.txt
  17. ECHO 数据处理完成
  18. PAUSE
复制代码
望各位大神指点一下哪里出了问题
读取的文件返回的数据都是空的
数组值一直都是输入的起始值

根据一楼和二楼的内容重新整合了一下
  1. setlocal enabledelayedexpansion
  2. SET /P file=请将需要处理的文件拖入本窗口:
  3. SET /P init=请输入生成数组起始值:
  4. CLS
  5. set str=.STRINGS
  6. ECHO %str%>logo.st
  7. SET str1=^$str[
  8. SET /a str2=%init%
  9. SET str3=^] = "
  10. SET str4=^"
  11. for /f "delims=" %%i in (%file%) do (
  12. SET "strall=%str1%!str2!%str3%%%i%str4%"
  13. ECHO !strall!>>logo.st
  14. SET /a str2=!str2!+1
  15. )
  16. SET str=.END
  17. ECHO %str%>>logo.st
  18. ECHO 数据处理完成
  19. PAUSE
复制代码
更简化的写法(二楼的程序)
  1. setlocal enabledelayedexpansion
  2. SET /P file=请将需要处理的文件拖入本窗口:
  3. SET /P init=请输入生成数组起始值:
  4. CLS
  5. ECHO .STRINGS>logo.st
  6. for /f "delims=" %%i in (%file%) do echo $str[!init!] = "%%i">>logo.st&set /a init+=1
  7. ECHO .END>>logo.st
  8. ECHO 数据处理完成
  9. PAUSE
复制代码
这个代码对某些特殊符号就没用了,比如带分号的就过滤了.


感谢七楼的  0000 代码,完美解决各种特殊字符的问题
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /p input=输入文件名:

  4. type "!input!"|find /v /c "">_
  5. set /p n=<_
  6. <"!input!" >"abcd.txt" (
  7. echo .STRINGS
  8. for /l %%a in (1,1,!n!) do (
  9.   set /p i=
  10.   echo $str[%%a] = "!i!"
  11. )
  12. echo .END

  13. )
复制代码
高人啊,哈哈~


最终我改了一下代码
  1. setlocal enabledelayedexpansion
  2. set /p input=输入文件名:

  3. type "!file!"|find /v /c "">temp.a
  4. set /p n=<temp.a
  5. <"!file!" >"abcd.txt" (
  6. echo .STRINGS
  7. for /l %%a in (1,1,!n!) do (
  8.   set /p i=
  9.   echo $str[%%a] = "!i!"
  10. )
  11. echo .END
  12. )
  13. DEL /F temp.a
复制代码
这样就更好理解了.
发表于 2017-10-16 09:56:23 | 显示全部楼层
好像是变量延迟问题啊,有些变量都 用!!了 ,为什么不开变量延迟?

前面开变量延迟
  1. setlocal enabledelayedexpansion
复制代码
后面for 语言中  要改一改
  1. SET strall=%str1%!str2!%str3%%%i%str4%
  2. ECHO !strall!>>abcd.txt
  3. SET /a str2=!str2!+1
复制代码
差不多应该可以了。

评分

参与人数 1技术 +1 收起 理由
冰剑 + 1 按照你说的果然没问题了,谢谢,不过分号和空 ...

查看全部评分

发表于 2017-10-16 14:08:37 | 显示全部楼层
本帖最后由 Blitz 于 2017-10-16 14:22 编辑
  1. @echo off&setlocal enabledelayedexpansion
  2. set /p file=请将需要处理的文件拖入本窗口:
  3. set /p init=请输入生成数组起始值:
  4. cls
  5. echo .STRINGS>abcd.txt
  6. for /f "delims=" %%i in (%file%) do echo $str[!init!] = "%%i">>abcd.txt&set /a init+=1
  7. echo .END>>abcd.txt
  8. echo 数据处理完成
  9. pause
复制代码
主要问题就是二楼说的没开变量延迟,还有你代码太杂乱了,那么多set干嘛,固定不变的直接echo就行了

评分

参与人数 1技术 +1 收起 理由
冰剑 + 1 太牛掰了,一行代码解决了我那么多问题,哈哈 ...

查看全部评分

 楼主| 发表于 2017-10-16 17:55:40 | 显示全部楼层
回复 3# Blitz


    如果源文件里面有特殊符号怎么能让批处理不过滤呢?
比如分号,等号,大于号之类的
发表于 2017-10-16 19:14:39 | 显示全部楼层
回复 4# 冰剑


    你举个列子吧,因为我这边好像没问题
发表于 2017-10-16 19:39:09 | 显示全部楼层
回复 4# 冰剑


    哦哦,发现以分号开头的行会被过滤了,改成这样:
  1. @echo off&setlocal enabledelayedexpansion
  2. set /p file=请将需要处理的文件拖入本窗口:
  3. set /p init=请输入生成数组起始值:
  4. cls
  5. echo .STRINGS>abcd.txt
  6. for /f "eol= delims=" %%i in (%file%) do echo $str[!init!] = "%%i">>abcd.txt&set /a init+=1
  7. echo .END>>abcd.txt
  8. echo 数据处理完成
  9. pause
复制代码

评分

参与人数 1技术 +1 收起 理由
冰剑 + 1 哈哈,你成功的把第一个字符是空格的行都过滤 ...

查看全部评分

发表于 2017-10-16 23:02:49 | 显示全部楼层
本帖最后由 0000 于 2017-10-16 23:04 编辑

回复 5# Blitz


    在里面加个'!'试一下
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /p input=输入文件名:
  4. set /p output=输出文件名:

  5. type "!input!"|find /v /c "">_
  6. set /p n=<_
  7. <"!input!" >"!output!" (
  8. echo .STRINGS
  9. for /l %%a in (1,1,!n!) do (
  10.   set /p i=
  11.   echo $str[%%a] = "!i!"
  12. )
  13. echo .END
  14. )
复制代码

评分

参与人数 1技术 +1 收起 理由
冰剑 + 1 牛逼的不要不要的,哈哈,超赞

查看全部评分

发表于 2017-10-17 10:13:26 | 显示全部楼层
回复 7# 0000


   对。。都忘了变量延迟和感叹号了,能不能把你的代码注释一下,学习学习
 楼主| 发表于 2017-10-17 16:13:49 | 显示全部楼层
回复 8# Blitz


    setlocal enabledelayedexpansion
set /p input=输入文件名:

type "!file!"|find /v /c "">temp.a/统计文件内行数,并保存到临时文件temp.a中
set /p n=<temp.a                      /从临时文件读入行数
<"!file!" >"abcd.txt" (                /读取源文件并保存到abcd.txt,条件是:
echo .STRINGS
for /l %%a in (1,1,!n!) do (
  set /p i=
  echo $str[%%a] = "!i!"
)
echo .END
)
DEL /F temp.a                          /删除临时文件
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-18 00:17 , Processed in 0.022633 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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