我有多个文本文件大约有10万行,我想把它们拆分成更小的文本文件,每行5000行。
我用了:
- split -l 5000 filename.txt
创建文件:
- xaa
- xab
- aac
- xad
- xbe
- aaf
没有扩展名的文件我只想打电话给他们:
- file01.txt
- file02.txt
- file03.txt
- file04.txt
或者如果不可能,我只是希望他们拥有“.txt”扩展名。
解决方法
- @ECHO OFF
- SETLOCAL
- SET "sourcedir=U:\sourcedir"
- SET /a fcount=100
- SET /a llimit=5000
- SET /a lcount=%llimit%
- FOR /f "usebackqdelims=" %%a IN ("%sourcedir%\q25249516.txt") DO (
- CALL :select
- FOR /f "tokens=1*delims==" %%b IN ('set dfile') DO IF /i "%%b"=="dfile" >>"%%c" ECHO(%%a
- )
- GOTO :EOF
- :select
- SET /a lcount+=1
- IF %lcount% lss %llimit% GOTO :EOF
- SET /a lcount=0
- SET /a fcount+=1
- SET "dfile=%sourcedir%\file%fcount:~-2%.txt"
- GOTO :EOF
这是一个本机Windows批处理,应该完成任务。
现在我不会说它会很快(每个5Kline输出文件不到2分钟),或者它会免受批量字符敏感。真的取决于你的目标数据的特点。
我使用一个名为q25249516.txt的文件,其中包含100K线的数据用于我的测试。
修改更快版本
REM
- @ECHO OFF
- SETLOCAL
- SET "sourcedir=U:\sourcedir"
- SET /a fcount=199
- SET /a llimit=5000
- SET /a lcount=%llimit%
- FOR /f "usebackqdelims=" %%a IN ("%sourcedir%\q25249516.txt") DO (
- CALL :select
- >>"%sourcedir%\file$$.txt" ECHO(%%a
- )
- SET /a lcount=%llimit%
- :select
- SET /a lcount+=1
- IF %lcount% lss %llimit% GOTO :EOF
- SET /a lcount=0
- SET /a fcount+=1
- MOVE /y "%sourcedir%\file$$.txt" "%sourcedir%\file%fcount:~-2%.txt" >NUL 2>nul
- GOTO :EOF
请注意,我使用了50000的llimit进行测试。如果llimit * 100比文件中的行数更多,则会覆盖早期文件编号(通过将fcount设置为1999并在文件重命名行中使用〜3代替〜2来修复)。