Board logo

标题: [文本处理] 【已解决】BAT批处理合并文本时如何保留空行? [打印本页]

作者: 思想之翼    时间: 2014-6-28 11:51     标题: 【已解决】BAT批处理合并文本时如何保留空行?

本帖最后由 思想之翼 于 2014-7-24 18:11 编辑

问题1
  1. @echo off
  2. pushd "c:\数据\文件3\"
  3. for /f "delims=" %%i in ('dir /b *.txt') do (type "%%i">>c:\数据\文件4\4.txt)
  4. exit
复制代码
c:\数据\文件3\ 文件夹内有001.txt  002.txt  003.txt三个文本,001.txt 有一行数据001,002.txt 为空,003.txt有一行数据003,用上述代码将001.txt  002.txt  003.txt三个文本合并,得到的文本数据为:
001
003
如何才可以保留没有数据的002.txt 的空行,得到的文本数据为:
001

003



问题2
  1. @echo off&setlocal enabledelayedexpansion
  2. set 文件数=4
  3. for /l %%a in (1,1,%文件数%) do (
  4.     for /f "delims=" %%i in (C:/数据/文件3/%%a.txt) do (
  5.         set /a n+=1
  6.         for %%a in (!n!) do set "#%%a=!#%%a! %%i"
  7.     )
  8.     set /a m=n,n=0
  9. )
  10. (for /l %%a in (1,1,%m%) do echo,!#%%a:~1!)>C:/数据/文件4/4.txt
复制代码
c:\数据\文件3\ 文件夹内有1.txt  2.txt  3.txt  4.txt四个文本,1.txt 数据为001,放置在第一行;002.txt 数据为002,放置在第二行;3.txt没有数据;4.txt数据为004,放置在第四行。用上述代码将1.txt  2.txt  3.txt  4.txt四个文本合并,得到的文本数据为:
001 002 004
如何才可以保留各文本内没有数据的空行,得到的文本数据为:
001
002

004
作者: apang    时间: 2014-6-28 13:06

1
  1. @echo off
  2. pushd "c:\数据\文件3\"
  3. (for %%a in (*.txt) do (
  4.     if not "%%~za" == "0" (
  5.         type "%%a"
  6.     ) else echo,
  7. ))>$
  8. move $ "c:\数据\文件4\4.txt"
  9. pause
复制代码
2
  1. @echo off
  2. pushd "c:\数据\文件3\"
  3. (for /l %%a in (1 1 4) do (
  4.     for %%b in (%%a.txt) do (
  5.         if not "%%~zb" == "0" (
  6.             type %%a.txt
  7.         ) else echo,
  8.     )
  9. ))>$
  10. move $ "c:\数据\文件4\4.txt"
  11. pause
复制代码

作者: 思想之翼    时间: 2014-6-28 13:57

回复 2# apang

感谢您的帮助!
经过测试,问题1解决了,问题2没有解决。放上问题2的测试附件,还望继续得到您的帮助。
作者: xxpinqz    时间: 2014-6-28 15:46

楼主自己要确认下测试的文件,3.txt是空文档,依顶楼的说明,输出时如果第几号文档为空(0字节),则表示这个文件的第几行强制输出为空行?是不是这意思?
作者: CrLf    时间: 2014-6-28 16:00

本帖最后由 CrLf 于 2014-6-28 16:23 编辑

第二个问题,把它写成:
  1. for /f "tokens=1* delims=:" %%i in ('findstr /n . C:/数据/文件3/%%a.txt') do (
  2.         set "#%%i=!#%%i! %%j"
  3. )
复制代码
其实最好用 sed 或 gawk:
  1. (for /l %%a in (1,1,%文件数%) do sed -n "N;${s/\n/ /g;p}" C:/数据/文件3/%%a.txt)>C:/数据/文件4/4.txt
复制代码
  1. gawk -v max=%文件数% -v "FNR==1&&NR>1{print \"\";if(++n>max)exit}{printf $0 FS}" C:/数据/文件3/*.txt>C:/数据/文件4/4.txt
复制代码
其实还有更简单的:
  1. (for /l %%a in (1,1,%文件数%) do xargs echo<C:/数据/文件3/%%a.txt)>C:/数据/文件4/4.txt
复制代码

作者: zhanglei1371    时间: 2014-6-28 16:21

用js应该也没问题的:
  1. @if (0)==(0) echo off
  2. pushd pushd "c:\数据\文件3\"
  3. dir /b *.txt |cscript /nologo /e:jscript %0
  4. start "" "c:\数据\文件4\4.txt"
  5. pause&exit/b
  6. @end
  7. var str=""
  8. var fso = new ActiveXObject("Scripting.FileSystemObject")
  9. while (!WScript.StdIn.AtEndOfStream) {
  10.     f = WScript.StdIn.ReadLine();
  11. // cm.set.p(f)
  12.     txt = fso.OpenTextFile(f).ReadAll();
  13. str=str+txt+"\r\n"
  14. }
  15. fso.OpenTextFile("c:\\数据\\文件4\\4.txt", 2, true).Write(str)
复制代码

作者: apang    时间: 2014-6-28 20:51

第2问,这样试下
  1. @echo off & setlocal enabledelayedexpansion
  2. set 文件数=6
  3. set max=0
  4. pushd "C:\数据\文件3\"
  5. for /l %%a in (1,1,%文件数%) do (
  6.     set "n=0"
  7.     for /f "tokens=1*delims=:" %%i in ('findstr /n . %%a.txt') do (
  8.         set "#%%i=!#%%i!%%j "
  9.         set "n=%%i"
  10.     )
  11.     if !n! gtr !max! set "max=!n!"
  12. )
  13. (for /l %%a in (1,1,%max%) do echo,!#%%a!)>C:/数据/文件4/4.txt
  14. pause
复制代码

作者: CrLf    时间: 2014-6-28 21:05

噢,原来我理解错了,那么 gawk 应该是这样:
  1. gawk -v max=%文件数% -v "FNR==1&&NR>1{if(++n>max)exit}{a[FNR]=a[FNR] $0 FS}END{for(i in a)print a[i]}" C:/数据/文件3/*.txt>C:/数据/文件4/4.txt
复制代码





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