Board logo

标题: [文本处理] 批处理如何将一个文本内的内容分割成两个文本 [打印本页]

作者: Rasm    时间: 2021-7-13 09:08     标题: 批处理如何将一个文本内的内容分割成两个文本

  1. zz1558684222----123456789a
  2. zzc96263----123654
  3. zzc96263----987654321
  4. zzj001----7758258
  5. zzj520138----123654
  6. zzp2001----12345
  7. zzp2001----7758258
  8. zzwp----123456789a
  9. zzwp----12345
  10. zzy369554039----987654321
  11. zzy369554039----123456789a
  12. zzzaaaa----123654
  13. zzzaaaa----987654321
复制代码




想通过分隔符   ---- 将左边的保存为1.txt,右边的保存为2.txt,如何实现?
作者: yakeyun    时间: 2021-7-13 10:03

回复 1# Rasm


@echo off
for /f "delims=---- tokens=1,*" %%i in (data.txt) do echo %%i>>1.TXT&echo %%j>>2.TXT
exit
作者: Rasm    时间: 2021-7-13 11:58

回复 2# yakeyun


    10MB的文件,用时11分钟
作者: qixiaobin0715    时间: 2021-7-13 13:14

  1. @echo off
  2. (for /f "tokens=1 delims=-" %%i in ('type test.txt') do echo,%%i)>1.txt
  3. (for /f "tokens=2 delims=-" %%a in ('type test.txt') do echo,%%a)>2.txt
  4. pause
复制代码

作者: yakeyun    时间: 2021-7-13 15:25

本帖最后由 yakeyun 于 2021-7-13 16:22 编辑

回复 3# Rasm

感谢4楼大佬的思路,在大佬的思路基础上优化了一下,可以再快一半效率:

@echo off
@echo,@echo off >1.bat
echo,^(for /f "delims=---- tokens=1,*" %%%%i in (data.txt) do echo %%%%i^) ^>1.TXT >>1.bat
echo,exit >>1.bat
start 1.bat
(for /f "delims=---- tokens=2" %%i in (data.txt) do echo %%i)>2.TXT
@del 1.bat
exit

可以试下看看这边测试基本10秒以内可以处理完,这次代码分别处理1和2的任务,然后用总的显示输出到文本,时间可以再节省一半左右。
作者: yd_wangqing    时间: 2021-7-13 20:41

@echo off
setlocal enabledelayedexpansion &chcp 65001
pushd %~dp0
if exist 1.txt del 1.txt
if exist 2.txt del 2.txt
if not exist 1.txt nul>1.txt
if not exist 2.txt nul>2.txt
for /f  "tokens=1,2 delims=----" %%i  in (dt.txt) do (
echo %%i>>1.txt
echo %%j>>2.txt
)
popd
echo 执行完成,按任意键退出。。。
pause
作者: Rasm    时间: 2021-7-13 23:46

回复 5# yakeyun


    总计用时30秒,比之前快了很多。6楼和你一样的方式,但是他的速度慢很多
作者: newswan    时间: 2021-7-14 01:05

本帖最后由 newswan 于 2021-7-14 02:22 编辑

sed
  1. sed -r -e "s/(.*)----(.*)/\1/" data.txt > d1.txt
  2. sed -r -e "s/(.*)----(.*)/\2/" data.txt > d2.txt
复制代码

作者: Batcher    时间: 2021-7-14 14:28

回复 6# yd_wangqing


把重定向放在for循环外部可以提升执行速度,参考:
https://mp.weixin.qq.com/s/VZk0TmYUpFdCoWK9ZpgL0Q
作者: Batcher    时间: 2021-7-14 14:36

回复 8# newswan


我来个 gawk
  1. gawk -F "----" "{print $1 > \"1.txt\"; print $2 > \"2.txt\"}" data.txt
复制代码

作者: yd_wangqing    时间: 2021-7-14 16:12

谢谢指导,确实速度提高了很多。
作者: yd_wangqing    时间: 2021-7-14 16:13

回复 9# Batcher


   
谢谢指导,确实速度提高了很多。
作者: newswan    时间: 2021-7-14 19:07

unix 老工具 真厉害,ms 真是业余的。
作者: newswan    时间: 2021-7-15 01:52

本帖最后由 newswan 于 2021-7-15 02:50 编辑

回复 13# newswan


    grep sed
  1. grep -P -o ".*(?=----)" data.txt > dg1.txt
  2. grep -P -o "(?<=----).*" data.txt > dg2.txt
  3. sed -r -e "s/----.*//" data.txt > ds1.txt
  4. sed -r -e "s/.*----//" data.txt > ds2.txt
复制代码
葫芦娃都出来玩玩
作者: newswan    时间: 2021-7-15 01:57

本帖最后由 newswan 于 2021-7-15 02:52 编辑

回复 1# Rasm


    powershell
  1.     $fc = (Get-Content data.txt)
  2.     $fc -replace "----.+","" | out-file -Encoding UTF8 data1.txt
  3.     $fc -replace ".+----","" | out-file -Encoding UTF8 data2.txt
复制代码
比较一下,看差距有多大
作者: 路过    时间: 2021-7-16 12:02

以前bat处理个10mb的文本文档,要30多分钟,有时候程序会崩溃,然后整个人也崩溃了。
作者: cmd1152    时间: 2021-7-18 12:32

回复 3# Rasm


    加括号会快很多




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