我有一个非常大的.csv文件(> 500MB),我希望在命令提示符下将其分解为更小的.csv文件。 (基本上试图在Windows中find一个Linux“分裂”function“。
这必须是一个批处理脚本,因为我的机器只安装了Windows,而且请求软件是一件痛苦的事情。 我遇到了一些示例代码( http://forums.techguy.org/software-development/1023949-split-100000-line-csv-into.html ),但是,当我执行批处理时,它不起作用。 我所得到的是一个输出文件,当我请求parsing每20000行时,它只有125kb。
有没有人遇到类似的问题,你是如何解决这个问题?
试试这个:
@echo off setLocal EnableDelayedExpansion set limit=20000 set file=export.csv set lineCounter=1 set filenameCounter=1 set name= set extension= for %%a in (%file%) do ( set "name=%%~na" set "extension=%%~xa" ) for /f "tokens=*" %%a in (%file%) do ( set splitFile=!name!-part!filenameCounter!!extension! if !lineCounter! gtr !limit! ( set /a filenameCounter=!filenameCounter! + 1 set lineCounter=1 echo Created !splitFile!. ) echo %%a>> !splitFile! set /a lineCounter=!lineCounter! + 1 )
如上面的代码所示,它将把原始的csv文件分割成多个csv文件,限制为20000行。 所有你需要做的就是改变!file!
和!limit!
相应地变化。 希望能帮助到你。
这是一个免费的Windows应用程序
http://www.addictivetips.com/windows-tips/csv-splitter-for-windows/
使用cgwin命令SPLIT。 样本 – 每500行计数一个文件:split -l 500 [filename.ext]
更多:split – 帮助
这会在newfile1.csv
给你1 to 20000
newfile1.csv
并在文件newfile2.csv
20001 to the end
行20001 to the end
它也克服了每行8K字符的限制。
这使用一个名为findrepl.bat
的帮助器批处理文件 – https://www.dropbox.com/s/rfdldmcb6vwi9xc/findrepl.bat
将findrepl.bat
放在与批处理文件相同的文件夹中或路径中。
它比一个简单的批处理文件更强大,速度也更快。
findrepl /o:1:20000 <file.csv >newfile1.csv findrepl /o:20001 <file.csv >newfile2.csv
如果分裂非常大的文件,我找到的解决方案是适应这个 ,PowerShell“嵌入”在一个批处理文件。 这工作很快 ,而不是我尝试的许多其他事情(我不知道其他选项张贴在这里)。
下面使用mysplit.bat
的方法是
mysplit.bat <mysize> 'myfile'
注:该脚本旨在使用第一个参数作为拆分大小。 目前硬编码为100Mb。 解决这个问题应该不难。
注2:电影名称应该用单引号括起来。 引用的其他替代方法显然不起作用。
注3:它以给定的字节数分割文件,而不是给定的行数。 对我来说这已经够好了。 可能会添加一些代码行来完成每个块的读取,直到下一个CR / LF。 这将完整的分割(不是一个固定的数字),而不会牺牲处理时间。
脚本mysplit.bat
:
@REM Using https://stackoverflow.com/questions/19335004/how-to-run-a-powershell-script-from-a-batch-file @REM and https://stackoverflow.com/questions/1001776/how-can-i-split-a-text-file-using-powershell @PowerShell ^ $upperBound = 100MB; ^ $rootName = %2; ^ $from = $rootName; ^ $fromFile = [io.file]::OpenRead($from); ^ $buff = new-object byte[] $upperBound; ^ $count = $idx = 0; ^ try { ^ do { ^ 'Reading ' + $upperBound; ^ $count = $fromFile.Read($buff, 0, $buff.Length); ^ if ($count -gt 0) { ^ $to = '{0}.{1}' -f ($rootName, $idx); ^ $toFile = [io.file]::OpenWrite($to); ^ try { ^ 'Writing ' + $count + ' to ' + $to; ^ $tofile.Write($buff, 0, $count); ^ } finally { ^ $tofile.Close(); ^ } ^ } ^ $idx ++; ^ } while ($count -gt 0); ^ } ^ finally { ^ $fromFile.Close(); ^ } ^ %End PowerShell%
我在寻找类似的解决方案时发现了这个问题。 我修改了@Dale为了达到我的目的而给出的答案。 我想要一些更灵活一些,并有一些错误陷阱。 只是觉得我可以把它放在这里为任何人寻找相同的东西。
@echo off setLocal EnableDelayedExpansion GOTO checkvars :checkvars IF "%1"=="" GOTO syntaxerror IF NOT "%1"=="-f" GOTO syntaxerror IF %2=="" GOTO syntaxerror IF NOT EXIST %2 GOTO nofile IF "%3"=="" GOTO syntaxerror IF NOT "%3"=="-n" GOTO syntaxerror IF "%4"=="" GOTO syntaxerror set param=%4 echo %param%| findstr /xr "[1-9][0-9]* 0" >nul && ( goto proceed ) || ( echo %param% is NOT a valid number goto syntaxerror ) :proceed set limit=%4 set file=%2 set lineCounter=1+%limit% set filenameCounter=0 set name= set extension= for %%a in (%file%) do ( set "name=%%~na" set "extension=%%~xa" ) for /f "usebackq tokens=*" %%a in (%file%) do ( if !lineCounter! gtr !limit! ( set splitFile=!name!_part!filenameCounter!!extension! set /a filenameCounter=!filenameCounter! + 1 set lineCounter=1 echo Created !splitFile!. ) cls echo Adding Line !splitFile! - !lineCounter! echo %%a>> !splitFile! set /a lineCounter=!lineCounter! + 1 ) echo Done! goto end :syntaxerror Echo Syntax: %0 -f Filename -n "Number Of Rows Per File" goto end :nofile echo %2 does not exist goto end :end