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