Archivo por lotes para dividir el archivo .csv

Tengo un archivo .csv muy grande (> 500 mb) y deseo descomponerlo en archivos .csv más pequeños en el símbolo del sistema. (Básicamente tratando de encontrar una función de “división” de Linux en Windows “.

Esto tiene que ser un script por lotes ya que mi máquina solo tiene Windows instaladas y solicitar softwares es un problema. Encontré una cantidad de códigos de muestra ( http://forums.techguy.org/software-development/1023949-split-100000-line-csv-into.html ), sin embargo, no funciona cuando ejecuto el lote. Todo lo que obtengo es un archivo de salida de solo 125kb cuando lo solicité para analizar cada 20 000 líneas.

¿Alguna vez alguien se ha encontrado con un problema similar y cómo resolvió el problema?

Probar esto:

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

Como se muestra en el código anterior, dividirá el archivo csv original en múltiples archivos csv con un límite de 20 000 líneas. ¡Todo lo que tiene que hacer es cambiar el !file! y !limit! variable en consecuencia. Espero eso ayude.

Una aplicación de Windows gratuita que hace eso

http://www.addictivetips.com/windows-tips/csv-splitter-for-windows/

Use el comando cgwin SPLIT. Muestras: dividir un archivo cada 500 líneas cuenta: dividir -l 500 [nombredearchivo.ext]

Para más: split –ayuda

Si se dividen archivos muy grandes, la solución que encontré es una adaptación de esto , con PowerShell “incrustado” en un archivo por lotes. Esto funciona rápido , a diferencia de muchas otras cosas que probé (no sabría sobre otras opciones publicadas aquí).

La forma de usar mysplit.bat continuación es

mysplit.bat 'myfile'

Nota: El script estaba destinado a usar el primer argumento como el tamaño de división. Actualmente está codificado a 100Mb. No debería ser difícil arreglar esto.

Nota 2: El nombre del archivo debe estar entre comillas simples. Otras alternativas para cotizar aparentemente no funcionan.

Nota 3: Divide el archivo en una determinada cantidad de bytes, no en un número dado de líneas. Para mí esto fue lo suficientemente bueno. Algunas líneas de código podrían ser probablemente agregadas para completar cada lectura de fragmento, hasta el siguiente CR / LF. Esto se dividirá en líneas completas (no con un número constante de ellas), sin sacrificar el tiempo de procesamiento.

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% 

Esto le dará las líneas 1 to 20000 en newfile1.csv
y líneas 20001 to the end en el archivo newfile2.csv

También supera el límite de caracteres 8K por línea.

Esto utiliza un archivo de lote auxiliar llamado findrepl.bat desde – https://www.dropbox.com/s/rfdldmcb6vwi9xc/findrepl.bat

Coloque findrepl.bat en la misma carpeta que el archivo por lotes o en la ruta.

Es más robusto que un archivo de proceso por lotes simple, y más rápido también.

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

Encontré esta pregunta mientras buscaba una solución similar. Modifiqué la respuesta que @Dale dio para mis propósitos. Quería algo que fuera un poco más flexible y que tuviera algún error de captura. Solo pensé que podría ponerlo aquí para cualquiera que esté buscando lo mismo.

 @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