separado punto por para extensión ejemplo descargar delimitado crear convertir configurar como comas coma archivos archivo abrir csv batch-file vbscript

punto - descargar archivo csv ejemplo



Copie las líneas del archivo.csv en otro archivo.csv utilizando la secuencia de comandos por lotes (2)

Estoy creando archivos .csv desde un dispositivo (salida) y necesito copiar un número específico de líneas de este archivo en otro archivo .csv que tiene el mismo formato.

Por suerte tienen el mismo formato, por lo que cada archivo tiene las mismas líneas para copiar (líneas 68 a 107). He intentado esto usando código de otras fuentes pero todo lo que he podido hacer hasta ahora es copiar los datos pero no puedo insertarlos en el otro archivo. ¡Cualquier ayuda sería genial!

@echo off Set "InputFile=C:/*****/Desktop/Dev/Test/Default.csv" Set "OutPutFile=C:/*****/Desktop/Dev/Test/OutputData.csv" Set FromLine=68 Set ToLine=107 Call:ExtractLinesFromTextFile "%InputFile%" %FromLine% %ToLine% > "%OutPutFile%" Exit /b :ExtractLinesFromTextFile <InputFile> <FromLine> <ToLine> ( echo Wscript.echo(ExtractLinesFromTextFile("%~1",%2,%3^)^) echo Function ExtractLinesFromTextFile(TextFile,FromLine,ToLine^) echo If FromLine ^<= ToLine Then echo With CreateObject("Scripting.FileSystemObject"^).OpenTextFile(TextFile^) echo Do Until .Line = FromLine Or .AtEndOfStream echo .SkipLine echo Loop echo Do Until .Line ^> ToLine Or .AtEndOfStream echo ExtractLinesFromTextFile = ExtractLinesFromTextFile ^& (.ReadLine ^& vbNewLine^) echo Loop echo End With echo End If echo End Function )>"%~n0.vbs" Cscript /Nologo "%~n0.vbs" "%~1" %~2 %~3 If Exist "%~n0.vbs" Del "%~n0.vbs" Exit /b


No es necesario utilizar un archivo por lotes que crea e invoca un VBScript.

Puede realizar la tarea con un script de proceso por lotes puro como este:

@echo off setlocal EnableExtensions EnableDelayedExpansion rem // Define constants here: set "_FILEIN=!USERPROFILE!/Desktop/Dev/Test/Default.csv" set "_FILEOUT=!USERPROFILE!/Desktop/Dev/Test/OutputData.csv" set /A "_LINEFROM=68" set /A "_LINETO=107" rem // Count number of lines of input file: for /F %%C in (''^< "!_FILEIN!" find /C /V ""'') do ( rem // Read and write files using redirection: < "!_FILEIN!" > "!_FILEOUT!" ( rem // Iterate through all available lines: for /L %%I in (1,1,%%C) do ( rem // Read a single line: set "LINE=" & set /P LINE="" rem // Check position (line number) of current line: if %%I GEQ %_LINEFROM% if %%I LEQ %_LINETO% ( rem // Return current line conditionally: echo(!LINE! ) ) ) ) endlocal exit /B

Tenga en cuenta que las soluciones de archivo por lotes puro pueden estar limitadas en cuanto a la longitud de línea y el tamaño de archivo. El enfoque antes mencionado no puede manejar líneas de más de 1023 bytes y archivos con más de 2147483647 líneas.

Aquí hay otra solución de script por lotes pura pero más lenta:

@echo off setlocal EnableExtensions DisableDelayedExpansion rem // Define constants here: set "_FILEIN=%USERPROFILE%/Desktop/Dev/Test/Default.csv" set "_FILEOUT=%USERPROFILE%/Desktop/Dev/Test/OutputData.csv" set /A "_LINEFROM=68" set /A "_LINETO=107" rem // Write file using redirection: > "%_FILEOUT%" ( rem // Read file using a loop, prefixed with line index: for /F "delims=" %%L in (''findstr /N "^" "%_FILEIN%"'') do ( rem // Extract line number: 2> nul set /A "IDX=%%L" rem // Read current line: set "LINE=%%L" setlocal EnableDelayedExpansion rem // Check position (line number) of current line: if !IDX! GEQ %_LINEFROM% if !IDX! LEQ %_LINETO% ( rem // Return current line conditionally: echo(!LINE:*:=! ) endlocal ) ) endlocal exit /B

Este enfoque no puede manejar líneas de más de 8191 - 7 = 8184 bytes y archivos con más de 2147483647 líneas.


Para ilustrar por qué no desea hacer esto en lote, este es el código para copiar las líneas 68 a 107 en otro archivo en VBScript:

inputFilename = "C:/path/to/input.csv" outputFilename = "C:/path/to/output.csv" fromLine = 68 toLine = 107 Set fso = CreateObject("Scripting.FileSystemObject") Set inFile = fso.OpenTextFile(inputFilename) Set outFile = fso.OpenTextFile(outputFilename, 2, True) Do Until inFile.AtEndOfStream Or inFile.Line > toLine line = inFile.ReadLine If inFile.Line >= fromLine Then outFile.WriteLine line Loop inFile.Close outFile.Close

Para ilustrar por qué no desea hacer esto en VBScript tampoco, esta es la misma operación en PowerShell:

$inputFile = ''C:/path/to/input.csv'' $outputFile = ''C:/path/to/output.csv'' $fromLine = 68 $toLine = 107 $skip = $fromLine - 1 $numLines = $toLine - $skip Get-Content $inputFile | Select-Object -Skip $skip -First $numLines | Set-Content $outputFile

que podría simplificarse a:

$inputFile = ''C:/path/to/input.csv'' $outputFile = ''C:/path/to/output.csv'' $skip = 67 $numLines = 40 Get-Content $inputFile | Select-Object -Skip $skip -First $numLines | Set-Content $outputFile

Incluso puede conservar el encabezado CSV si lo desea:

$inputFile = ''C:/path/to/input.csv'' $outputFile = ''C:/path/to/output.csv'' $skip = 66 $numLines = 40 Import-Csv $inputFile | Select-Object -Skip $skip -First $numLines | Export-Csv $outputFile -NoType