For /F
é capaz de analisar um arquivo .csv. Em uma linha, para ser executado diretamente no prompt de comando:
for /F "tokens=1,2,3* delims=," %i in (input.csv) do @echo %i,%l>>output.csv
Isso atravessa a linha input.csv para linha e usa uma vírgula como delimitador, armazena o primeiro valor em %i
, o segundo em %j
, o terceiro em %k
e o restante da string (usando um asterisco na lista de tokens) em %l
. Ao imprimir todos os valores, exceto o segundo e o terceiro, você está eliminando isso efetivamente.
No entanto, for /F
não conta strings vazias como tokens, portanto, o comando não pode diferenciar entre duas vírgulas subseqüentes e uma única. Essa solução funciona se as colunas vazias tiverem um caractere de espaço em branco, mas poderão ignorar as colunas erradas.
Para contornar essa restrição, podemos escrever um arquivo em lote que use substituição de string para inserir um espaço entre duas vírgulas subsequentes. Esta substituição é executada duas vezes para lidar com a possibilidade de três vírgulas. As aspas em ^"!line!^"
são necessárias para indicar que for /F
precisa operar em uma string em vez de em um arquivo e são evitadas para evitar que !line!
seja avaliado como uma string literal em vez de uma variável.
@echo off
setlocal EnableDelayedExpansion
for /F "delims=" %%a in (input.csv) do (
set line=%%a
set line=!line:,,=, ,!
set line=!line:,,=, ,!
for /F "tokens=1,2,3* delims=," %%i in (^"!line!^") do (
echo %%i,%%l>>output.csv
)
)
O resultado é um novo arquivo .csv, idêntico ao input.csv, exceto pelas segunda e terceira colunas omitidas.