File batch per dividere il file .csv

Ho un file .csv molto grande (> 500mb) e desidero suddividerlo in file .csv più piccoli nel prompt dei comandi. (Fondamentalmente cercando di trovare una funzione “split” di Linux in Windows “.

Questo deve essere uno script batch poiché la mia macchina ha solo Windows installato e la richiesta di software è un problema. Mi sono imbattuto in una serie di codici di esempio ( http://forums.techguy.org/software-development/1023949-split-100000-line-csv-into.html ), tuttavia, non funziona quando eseguo il batch. Tutto quello che ottengo è un file di output che è solo 125kb quando ho richiesto di analizzare ogni 20.000 righe.

Qualcuno ha mai incontrato un problema simile e come hai risolto il problema?

Prova questo:

@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 ) 

Come mostrato nel codice sopra, dividerà il file csv originale in più file csv con un limite di 20.000 linee. Tutto quello che devi fare è cambiare il !file! e !limit! variabile di conseguenza. Spero che sia d’aiuto.

Utilizzare il comando cgwin SPLIT. Esempi: elimina un file ogni 500 righe: split -l 500 [nomefile.ext]

Per ulteriori informazioni: split –help

Se si suddividono file molto grandi, la soluzione che ho trovato è un adattamento da questo , con PowerShell “incorporato” in un file batch. Funziona velocemente , al contrario di molte altre cose che ho provato (non saprei di altre opzioni pubblicate qui).

Il modo di usare mysplit.bat seguito è

mysplit.bat 'myfile'

Nota: lo script intendeva utilizzare il primo argomento come dimensione parziale. Attualmente è hardcoded a 100Mb. Non dovrebbe essere difficile risolvere questo problema.

Nota 2: il nome del file deve essere racchiuso tra virgolette singole. Altre alternative per la citazione apparentemente non funzionano.

Nota 3: divide il file a un determinato numero di byte, non a un determinato numero di linee. Per me è stato abbastanza buono. Probabilmente alcune linee di codice potrebbero essere aggiunte per completare ogni pezzo letto, fino al prossimo CR / LF. Questo si dividerà a righe intere (non con un numero costante di esse), senza alcun sacrificio nel tempo di elaborazione.

Script 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% 

Questo ti darà linee da 1 to 20000 in newfile1.csv
e le righe 20001 to the end nel file newfile2.csv

Supera anche il limite di 8K caratteri per riga.

Questo utilizza un file batch helper chiamato findrepl.bat da – https://www.dropbox.com/s/rfdldmcb6vwi9xc/findrepl.bat

Posiziona findrepl.bat nella stessa cartella del file batch o sul percorso.

È più robusto di un semplice file batch e anche più veloce.

 findrepl /o:1:20000 newfile1.csv findrepl /o:20001 newfile2.csv 

Ho trovato questa domanda mentre cercavo una soluzione simile. Ho modificato la risposta che @Dale ha dato per soddisfare i miei scopi. Volevo qualcosa che fosse un po ‘più flessibile e che avesse qualche errore nel trapping. Ho pensato che potrei metterlo qui per chiunque cerchi la stessa cosa.

 @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