Posso usar um arquivo em lotes para remover colunas em branco em um .csv

3

Eu tenho nove colunas no meu arquivo .csv atual, no entanto, as colunas 2 e 3 estão em branco e eu quero me livrar delas. Existe uma maneira de usar comandos em lote para remover essas colunas vazias do meu .csv ou exportar um novo .csv sem essas colunas em branco?

    
por batchnoober 17.03.2013 / 14:47

4 respostas

2

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.

    
por 18.03.2013 / 18:37
3

Você não especificou qual sistema operacional. Se o seu vem com cut , use isso.

cut -d',' -f1,4-9

-d define o delimitador, neste caso, para , . Como a vírgula não é um caractere especial, você pode omitir as aspas.
-f seleciona os campos, neste caso o campo 1 e os campos 4 a 9 (pulando os campos 2 e 3).

Testfile "example.cvs"
foo1,   ,   , ba1, baz1, blah1, wibble1, wubble1
foo2,   ,   , ba2, baz2, blah2, wibble2, wubble2
foo2,   ,   , ba3,     , blah3, wibble3, wubble3
foo2,   ,   , ba4, baz4, blah4, wibble4, wubble4

Um teste real do comando:

> cut -d',' -f1,4-9 example.cvs

foo1, ba1, baz1, blah1, wibble1, wubble1
foo2, ba2, baz2, blah2, wibble2, wubble2
foo2, ba3,     , blah3, wibble3, wubble3
foo2, ba4, baz4, blah4, wibble4, wubble4

O corte vem pré-instalado na maioria dos sistemas operacionais (por exemplo, OS / X, distribuições Linux, BSDs, Solaris, ...; praticamente todos, exceto o DOS e o Windows).

Se você tem o Windows, você pode:

  1. Abra o arquivo CVS em uma planilha (por exemplo, OpenOffice Calc ou MS Excel), exclua duas colunas e salve o arquivo . Difícil de automatizar, portanto, use somente se precisar fazer isso uma vez ou raramente.
  2. ou faça o download das ferramentas do Unix para Windows e coloque o comando cut em um arquivo em lotes.
por 17.03.2013 / 15:23
0

Eu abriria o arquivo CSV no Bloco de Notas (ou qualquer editor de texto) e procuraria e substituiria ,, por , . Isso, é claro, está supondo que os dados em suas colunas não têm ,, neles.

    
por 17.03.2013 / 14:58
0

Supondo que você esteja no Windows, o arquivo não tem cabeçalhos e você tem o Powershell disponível para você, é possível usar algo como o seguinte:

Import-Csv .\InFile.csv -Header col1,col2,col3,col4,col5 -Delimiter ',' | Select-Object col1,col4,col5 | ConvertTo-Csv | Select -skip 2 > .\OutFile.csv

Então:

  • Importa o CSV.
  • Atribui nomes de colunas para referência.
  • Seleciona todas as 5 colunas, exceto 2 e 3.
  • Converte de volta para um CSV adequado.
  • Seleciona o CSV, começando na linha 2 (para pular os cabeçalhos de coluna atribuídos)
  • envia para um arquivo de saída.
por 17.03.2013 / 17:06