如何在Windows中分割大文本文件?


Answers:


174

如果您已经安装了Windows版Git,则应该安装Git Bash,因为Git附带了该工具。

使用splitGit Bash中的命令分割文件:

  • 放入每个大小为500MB的文件中: split myLargeFile.txt -b 500m

  • 放入每个10000行的文件中: split myLargeFile.txt -l 10000

提示:

  • 如果您没有Git / Git Bash,请通过https://git-scm.com/download下载

  • 如果您丢失了Git Bash的快捷方式,则可以使用 C:\Program Files\Git\git-bash.exe

而已!


我总是喜欢例子...

例:

在此处输入图片说明

您可以在此图像,通过生成的文件中看到的split被命名为xaaxabxac,等。

这些名称由您可以指定的前缀和后缀组成。由于我没有指定我想要的前缀或后缀是什么样,因此前缀默认为x,后缀默认为两个字符的字母枚举。

另一个例子:

这个例子说明

  • 使用文件名前缀MySlice(而不是默认值x),
  • 所述-d用于使用数字后缀标志(而不是aaabac等等),
  • 以及-a 5告诉它的选项,我希望后缀为5位数字:

在此处输入图片说明


2
很好的解决方案,有很好的例子。在Windows 10中对我来说效果很好。对我来说,我曾经split myLogs.log mylogs_ -b 800m -a 3 -d拆分过4.5Gb日志文件。
user3437460

通过在Windows上使用Git-bash的不错的解决方案。对于这个split部分,使用文件名前缀-d选项应该是您的主要答案。相关:stackoverflow.com/a/45761990/1519522
AFF

谢谢你,做得很好!使用Windows 10并是Git bash的新手,这可能会有所帮助...默认工作目录为C:\ Users \ username(使用“ dir”查找当前工作目录)。更改目录的命令是“ cd / c / folder”。
fenix

好的,但是如果我想在Git Bash中选择* .txt,为什么不起作用?例如:split *.txt MyNewText -b 5m
Just Me

3
真好!您还可以在输出上设置扩展名...例如--additional-suffix = .txt
Nij

2
Set Arg = WScript.Arguments
set WshShell = createObject("Wscript.Shell")
Set Inp = WScript.Stdin
Set Outp = Wscript.Stdout
    Set rs = CreateObject("ADODB.Recordset")
    With rs
        .Fields.Append "LineNumber", 4 

        .Fields.Append "Txt", 201, 5000 
        .Open
        LineCount = 0
        Do Until Inp.AtEndOfStream
            LineCount = LineCount + 1
            .AddNew
            .Fields("LineNumber").value = LineCount
            .Fields("Txt").value = Inp.readline
            .UpDate
        Loop

        .Sort = "LineNumber ASC"

        If LCase(Arg(1)) = "t" then
            If LCase(Arg(2)) = "i" then
                .filter = "LineNumber < " & LCase(Arg(3)) + 1
            ElseIf LCase(Arg(2)) = "x" then
                .filter = "LineNumber > " & LCase(Arg(3))
            End If
        ElseIf LCase(Arg(1)) = "b" then
            If LCase(Arg(2)) = "i" then
                .filter = "LineNumber > " & LineCount - LCase(Arg(3))
            ElseIf LCase(Arg(2)) = "x" then
                .filter = "LineNumber < " & LineCount - LCase(Arg(3)) + 1
            End If
        End If

        Do While not .EOF
            Outp.writeline .Fields("Txt").Value

            .MoveNext
        Loop
    End With

filter cut {t|b} {i|x} NumOfLines

从文件的顶部或底部减少行数。

t - top of the file
b - bottom of the file
i - include n lines
x - exclude n lines

cscript /nologo filter.vbs cut t i 5 < "%systemroot%\win.ini"

另一种方法这输出线5001+,适合您的使用。这几乎不占用内存。

Do Until Inp.AtEndOfStream
         Count = Count + 1
         If count > 5000 then
            OutP.WriteLine Inp.Readline
         End If
Loop

当我尝试运行脚本时,出现诸如filter.vbs(16,13)Microsoft Cursor Engine的错误:内存不足。
2015年

您有32或64位窗口。如果从64位版本运行64位(c:\windows\sysnative\cscript etc-sysnative强制运行System32文件,而不是32位进程的SysWoW64文件)。如果是32位,则需要另一种技术,它将是特定的而不是通用的。
法案

我有一个64位的窗口。
阿尔宾2015年

所以我告诉你在这种情况下该怎么办。系统力64位。
法案


1

下面的代码分割文件每500个

@echo off
setlocal ENABLEDELAYEDEXPANSION
REM Edit this value to change the name of the file that needs splitting. Include the extension.
SET BFN=upload.txt
REM Edit this value to change the number of lines per file.
SET LPF=15000
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

参见下文:https : //forums.techguy.org/threads/solved-split-a-100000-line-csv-into-5000-line-csv-files-with-dos-batch.1023949/


0

当然有!Win CMD不仅可以分割文本文件,还可以做很多事情:)

将一个文本文件拆分为每个最大行的单独文件:

Split text file (max lines each):
: Initialize
set input=file.txt
set max=10000

set /a line=1 >nul
set /a file=1 >nul
set out=!file!_%input%
set /a max+=1 >nul

echo Number of lines in %input%:
find /c /v "" < %input%

: Split file
for /f "tokens=* delims=[" %i in ('type "%input%" ^| find /v /n ""') do (

if !line!==%max% (
set /a line=1 >nul
set /a file+=1 >nul
set out=!file!_%input%
echo Writing file: !out!
)

REM Write next file
set a=%i
set a=!a:*]=]!
echo:!a:~1!>>out!
set /a line+=1 >nul
)

如果以上代码挂起或崩溃,则此示例代码可以更快地拆分文件(通过将数据写入中间文件而不是将所有内容保留在内存中):

例如。将7600行的文件分割为最大3000行的较小文件。

  1. 使用set命令生成正则表达式字符串/模式文件,以将其馈入/g标志findstr

list1.txt

\ [[0-9] \]
\ [[0-9] [0-9] \]
\ [[0-9] [0-9] [0-9] \]
\ [[0-2] [ 0-9] [0-9] [0-9] \]

list2.txt

\ [[3-5] [0-9] [0-9] [0-9] \]

list3.txt

\ [[6-9] [0-9] [0-9] [0-9] \]

  1. 将文件拆分为较小的文件:
type "%input%" | find /v /n "" | findstr /b /r /g:list1.txt > file1.txt
type "%input%" | find /v /n "" | findstr /b /r /g:list2.txt > file2.txt
type "%input%" | find /v /n "" | findstr /b /r /g:list3.txt > file3.txt
  1. 删除每个文件分割的前缀行号:
    例如 对于第一个文件:
for /f "tokens=* delims=[" %i in ('type "%cd%\file1.txt"') do (
set a=%i
set a=!a:*]=]!
echo:!a:~1!>>file_1.txt)

注意:
适用于前导空格,空白行和空格行。

在Win 10 x64 CMD,4.4GB文本文件,5651982行上进行了测试。


-4

您可以将命令拆分用于此任务。例如,此命令输入到命令提示符

split YourLogFile.txt -b 500m

创建几个文件,每个文件的大小为500 MB。您需要一个大小的文件几分钟。您可以将输出文件(默认名称为“ xaa”,“ xab”等)重命名为* .txt,以在您选择的编辑器中将其打开。

确保检查命令的帮助文件。您还可以按行数拆分日志文件,或更改输出文件的名称。

(在Windows 7 64位上测试)


28
“'split'不被识别为内部或外部命令,可操作程序或批处理文件。” -在Win 7 Ultimate SP1(64位)上
Christopher J Smith,

1
我相信您实际上使用过gitbash的分割
Ilya Yevlampiev '19

好的,但是如果我想在Git Bash中选择* .txt,为什么不起作用?例如:split * .txt MyNewText -b 5m
Just Me
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.