Board logo

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

作者: 冰剑    时间: 2017-10-16 03:54     标题: [已解决]字符串组合问题(望指正)

本帖最后由 冰剑 于 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
复制代码
这样就更好理解了.
作者: cfwyy77_bat    时间: 2017-10-16 09:56

好像是变量延迟问题啊,有些变量都 用!!了 ,为什么不开变量延迟?

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

本帖最后由 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就行了
作者: 冰剑    时间: 2017-10-16 17:55

回复 3# Blitz


    如果源文件里面有特殊符号怎么能让批处理不过滤呢?
比如分号,等号,大于号之类的
作者: Blitz    时间: 2017-10-16 19:14

回复 4# 冰剑


    你举个列子吧,因为我这边好像没问题
作者: Blitz    时间: 2017-10-16 19:39

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

作者: 0000    时间: 2017-10-16 23:02

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

作者: Blitz    时间: 2017-10-17 10:13

回复 7# 0000


   对。。都忘了变量延迟和感叹号了,能不能把你的代码注释一下,学习学习
作者: 冰剑    时间: 2017-10-17 16:13

回复 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                          /删除临时文件




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