标题: [文本处理] 【已解决】BAT批处理合并文本时如何保留空行? [打印本页]
作者: 思想之翼 时间: 2014-6-28 11:51 标题: 【已解决】BAT批处理合并文本时如何保留空行?
本帖最后由 思想之翼 于 2014-7-24 18:11 编辑
问题1- @echo off
- pushd "c:\数据\文件3\"
- for /f "delims=" %%i in ('dir /b *.txt') do (type "%%i">>c:\数据\文件4\4.txt)
- 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- @echo off&setlocal enabledelayedexpansion
- set 文件数=4
- for /l %%a in (1,1,%文件数%) do (
- for /f "delims=" %%i in (C:/数据/文件3/%%a.txt) do (
- set /a n+=1
- for %%a in (!n!) do set "#%%a=!#%%a! %%i"
- )
- set /a m=n,n=0
- )
- (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- @echo off
- pushd "c:\数据\文件3\"
- (for %%a in (*.txt) do (
- if not "%%~za" == "0" (
- type "%%a"
- ) else echo,
- ))>$
- move $ "c:\数据\文件4\4.txt"
- pause
复制代码
2- @echo off
- pushd "c:\数据\文件3\"
- (for /l %%a in (1 1 4) do (
- for %%b in (%%a.txt) do (
- if not "%%~zb" == "0" (
- type %%a.txt
- ) else echo,
- )
- ))>$
- move $ "c:\数据\文件4\4.txt"
- 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 编辑
第二个问题,把它写成:- for /f "tokens=1* delims=:" %%i in ('findstr /n . C:/数据/文件3/%%a.txt') do (
- set "#%%i=!#%%i! %%j"
- )
复制代码
其实最好用 sed 或 gawk:- (for /l %%a in (1,1,%文件数%) do sed -n "N;${s/\n/ /g;p}" C:/数据/文件3/%%a.txt)>C:/数据/文件4/4.txt
复制代码
- gawk -v max=%文件数% -v "FNR==1&&NR>1{print \"\";if(++n>max)exit}{printf $0 FS}" C:/数据/文件3/*.txt>C:/数据/文件4/4.txt
复制代码
其实还有更简单的:- (for /l %%a in (1,1,%文件数%) do xargs echo<C:/数据/文件3/%%a.txt)>C:/数据/文件4/4.txt
复制代码
作者: zhanglei1371 时间: 2014-6-28 16:21
用js应该也没问题的:- @if (0)==(0) echo off
- pushd pushd "c:\数据\文件3\"
- dir /b *.txt |cscript /nologo /e:jscript %0
- start "" "c:\数据\文件4\4.txt"
- pause&exit/b
- @end
-
- var str=""
- var fso = new ActiveXObject("Scripting.FileSystemObject")
- while (!WScript.StdIn.AtEndOfStream) {
- f = WScript.StdIn.ReadLine();
- // cm.set.p(f)
- txt = fso.OpenTextFile(f).ReadAll();
- str=str+txt+"\r\n"
- }
- fso.OpenTextFile("c:\\数据\\文件4\\4.txt", 2, true).Write(str)
复制代码
作者: apang 时间: 2014-6-28 20:51
第2问,这样试下- @echo off & setlocal enabledelayedexpansion
- set 文件数=6
- set max=0
- pushd "C:\数据\文件3\"
- for /l %%a in (1,1,%文件数%) do (
- set "n=0"
- for /f "tokens=1*delims=:" %%i in ('findstr /n . %%a.txt') do (
- set "#%%i=!#%%i!%%j "
- set "n=%%i"
- )
- if !n! gtr !max! set "max=!n!"
- )
- (for /l %%a in (1,1,%max%) do echo,!#%%a!)>C:/数据/文件4/4.txt
- pause
复制代码
作者: CrLf 时间: 2014-6-28 21:05
噢,原来我理解错了,那么 gawk 应该是这样:- 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://www.bathome.net/) |
Powered by Discuz! 7.2 |