当前位置: 首页 > 知识库问答 >
问题:

批量拆分一个文本文件

宰父学
2023-03-14

我有这个批处理文件来拆分txt文件:

@echo off
for /f "tokens=1*delims=:" %%a in ('findstr /n "^" "PASSWORD.txt"') do for /f "delims=~" %%c in ("%%~b") do >"text%%a.txt" echo(%%c
pause

它可以工作,但它一行一行地拆分它。我如何让它每5000行拆分一次。提前感谢。

编辑:

I have just tried this:

@echo off
setlocal ENABLEDELAYEDEXPANSION
REM Edit this value to change the name of the file that needs splitting. Include the extension.
SET BFN=passwordAll.txt
REM Edit this value to change the number of lines per file.
SET LPF=50000
REM Edit this value to change the name of each short file. It will be followed by a number indicating where it is in the list.
SET SFN=SplitFile

REM Do not change beyond this line.

SET SFX=%BFN:~-3%

SET /A LineNum=0
SET /A FileNum=1

For /F "delims==" %%l in (%BFN%) Do (
SET /A LineNum+=1

echo %%l >> %SFN%!FileNum!.%SFX%

if !LineNum! EQU !LPF! (
SET /A LineNum=0
SET /A FileNum+=1
)

)
endlocal
Pause
exit

但我得到一个错误提示:<code>没有足够的存储空间来处理此命令。<code>

共有3个答案

翟奕
2023-03-14
@echo off
setlocal EnableDelayedExpansion

findstr /N "^" PASSWORD.txt > temp.txt
set part=0
call :splitFile < temp.txt
del temp.txt
goto :EOF

:splitFile
set /A part+=1
(for /L %%i in (1,1,5000) do (
   set "line="
   set /P line=
   if defined line echo(!line:*:=!
)) >  text%part%.txt
if defined line goto splitFile
exit /B

如果输入文件没有空行,可以修改前面的方法以便运行得更快。

卫琛
2023-03-14

测试一下:例如,输入文件是< code >“file . txt”,输出文件是< code >“split file-5000 . txt”。

这使用了一个名为findrepl.bat的辅助批处理文件-下载地址:https://www.dropbox.com/s/rfdldmcb6vwi9xc/findrepl.bat

放置<code>findrepl。bat与批处理文件位于同一文件夹中或路径上。

@echo off
:: splits file.txt into 5000 line chunks. 
set chunks=5000

set /a s=1-chunks
:loop
set /a s=s+chunks
set /a e=s+chunks-1
echo %s% to %e%
call findrepl /o:%s%:%e% <"file.txt" >"splitfile-%e%.txt"
for %%b in ("splitfile-%e%.txt") do (if %%~zb EQU 0 del "splitfile-%e%.txt" & goto :done)
goto :loop
:done
pause

一个限制是文件中的行数,真正最大的行数是2^31-1,其中批处理数学最多。

耿招
2023-03-14

这会给你一个基本的框架。根据需要进行调整

@echo off
    setlocal enableextensions disabledelayedexpansion

    set "nLines=5000"
    set "line=0"

    for /f "usebackq delims=" %%a in ("passwords.txt") do (
        set /a "file=line/%nLines%", "line+=1"
        setlocal enabledelayedexpansion
        for %%b in (!file!) do (
            endlocal
            >>"passwords_%%b.txt" echo(%%a
        )
    )

    endlocal

编辑

正如评论所指出的,4.3GB的文件很难管理。< code>for /f需要将整个文件加载到内存中,当文件在内存中转换为unicode时,所需的缓冲区是这个大小的两倍。

这是一个完全临时的解决方案。我还没有在这么高的文件中测试过它,但至少在理论上它应该可以工作(除非5000行需要大量的内存,这取决于行长)

而且,有了这样的文件,它会很慢。

@echo off
    setlocal enableextensions disabledelayedexpansion

    set "line=0"
    set "tempFile=%temp%\passwords.tmp"

    findstr /n "^" passwords.txt > "%tempFile%"
    for /f %%a in ('type passwords.txt ^| find /c /v "" ') do set /a "nFiles=%%a/5000"

    for /l %%a in (0 1 %nFiles%) do (
        set /a "e1=%%a*5", "e2=e1+1", "e3=e2+1", "e4=e3+1", "e5=e4+1"
        setlocal enabledelayedexpansion
        if %%a equ 0 (
            set "e=/c:"[1-9]:" /c:"[1-9][0-9]:" /c:"[1-9][0-9][0-9]:" /c:"!e2![0-9][0-9][0-9]:" /c:"!e3![0-9][0-9][0-9]:" /c:"!e4![0-9][0-9][0-9]:" /c:"!e5![0-9][0-9][0-9]:" "
        ) else (
            set "e=/c:"!e1![0-9][0-9][0-9]:" /c:"!e2![0-9][0-9][0-9]:" /c:"!e3![0-9][0-9][0-9]:" /c:"!e4![0-9][0-9][0-9]:" /c:"!e5![0-9][0-9][0-9]:" "
        )
        for /f "delims=" %%e in ("!e!") do (
            endlocal & (for /f "tokens=1,* delims=:" %%b in ('findstr /r /b %%e "%tempFile%"') do @echo(%%c)>passwords_%%a.txt
        )
    )

    del "%tempFile%" >nul 2>nul

    endlocal

再次编辑:前面的代码不能正确处理以冒号开头的行,因为它在< code>for命令中被用作分隔符,用于分隔行号和数据。

对于替代方案,仍然是纯批次,但仍然缓慢

@echo off
    setlocal enableextensions disabledelayedexpansion

    set "nLines=5000"
    set "line=0"
    for /f %%a in ('type passwords.txt^|find /c /v ""') do set "fileLines=%%a"

    < "passwords.txt" (for /l %%a in (1 1 %fileLines%) do (
        set /p "data="
        set /a "file=line/%nLines%", "line+=1"
        setlocal enabledelayedexpansion
        >>"passwords_!file!.txt" echo(!data!
        endlocal
    ))

    endlocal
 类似资料:
  • 问题内容: 我得到一个包含以下内容的文本文件(12 MB): 有什么办法来分流到12个* .txt文件让说,,(......)? 问题答案: 您可以使用linux bash核心实用程序 注意,或两者都OK,但大小不同。MB为1000 * 1000,M为1024 ^ 2 如果要按行分隔,可以使用参数。 更新 Kirill建议的另一种解决方案,您可以执行以下操作 请注意,是不是,有几个选项,比如,,,

  • 问题内容: 我想将一个大小约为50GB的大型文本文件拆分为多个文件。文件中的数据就像这样-[x = 0-9之间的任何整数] 文件中可能只有几十亿行,我想为每个文件写例如30/40百万。我想这些步骤将是- 我要打开文件 然后使用readline()必须逐行读取文件并同时写入新文件 一旦达到最大行数,它将创建另一个文件并再次开始写入。 我想知道如何将所有这些步骤以一种高效且更快的内存方式组合在一起。我

  • 问题内容: 我有一些带有时间信息的文本文件,例如: 现在,我需要文件的第三列来计算平均值。 我怎样才能做到这一点?我需要获取所有文本行,然后获取最后一列? 问题答案: 您可以阅读通过线使用的文件中的行或,甚至一些其他techinique。使用扫描仪非常简单,如下所示: 要使用定义的分隔符分割字符串,可以使用split方法,该方法将正则表达式作为参数,并按与该表达式匹配的所有字符序列分割字符串。就您

  • 问题内容: 我正在尝试将一个大型xml文件拆分为多个文件,并在AWK脚本中使用了以下代码。 上面的代码生成一个名称为“ fileItem_1”,“ fileItem_2”,“ fileItem3”等的xml文件列表。 但是,我希望文件名类似于“ item_XXXXX”,其中XXXXX是XML内的一个节点-如下图所示 因此,基本上我希望“ id”节点为文件名。谁能帮我这个忙吗? 问题答案: 我不会用

  • 我遇到了Streams的或方法的问题,因为spliterator跳过特定模式(奇数或偶数)的文本部分。应该做什么来处理文本的所有部分?我在这里的方法: 示例输入为: 它将跳过Faysal:2和Faysal:4

  • 本文向大家介绍Ruby实现的一个强大的批量删除文件脚本分享,包括了Ruby实现的一个强大的批量删除文件脚本分享的使用技巧和注意事项,需要的朋友参考一下 最近打包服务器上的apk包又增多了,每次手动rm操作过于麻烦,于是花了几分钟写了一个可以对指定目录下根据最后修改时间和通配符匹配进行批量删除的脚本。将这个脚本加入crontab中之后,以后就再也不用担心多余的安装包占用磁盘空间了。 简短的代码 如何