Removendo quebras de linha do CSV para a importação adequada do Excel

0

Então, criei um script em lote que gera algum texto para um arquivo CSV. Quando eu abro o CSV no Bloco de Notas, parece que é assim que eu quero.

173030,8,2793,2821244
173032,1,2793,2820692
173033,1,2793,2821120
173035,2,2793,2820788

No entanto, no Excel, aparece como:

173030   8
2793
2821244

173032   1
2793
2820692

173033   1
2793
2821120

173035   2
2793
2820788

O ponto é que existem algumas quebras de linha indesejadas. Parece que o bloco de notas reconhecer apenas uma quebra de linha CRLF, mas existem algumas outras que são apenas CR ou LF que o Excel vê que o bloco de notas não. Qual é a melhor maneira de cuidar disso? Como eu já estou criando isso por meio de um script em lote, seria melhor se houvesse um comando em lote que pudesse remover as quebras de linha indesejadas. Mas se houver talvez uma configuração de excel ou algo que eu possa mudar, isso pode funcionar também.

    
por Michael 11.06.2015 / 22:09

2 respostas

1

Se o seu exemplo for preciso, talvez você não esteja criando algo que o Excel realmente possa entender. Eu recomendaria tentar colocar uma linha contendo cabeçalhos como a primeira linha para ver se isso ajuda.

Verifique também os finais de linha para garantir que você está adicionando \ r \ n (por exemplo, terminações de linha do Windows) em vez de apenas \ n - o Excel deve lidar com o posterior, mas pode ser difícil saber.

Por fim, certifique-se de que sua saída em lote não inclua caracteres falsos. Por exemplo, você tem certeza de que os números não têm caracteres iniciais ou finais, como um código binário < 32?

ATUALIZAÇÃO:

OK, o arquivo que você compartilhou não é um arquivo CSV válido. Você deve tirar os caracteres estranhos. Acabei de abri-lo no editor de texto de colchetes e as linhas estão divididas lá. É por isso que o Excel está fazendo o mesmo.

Na primeira linha, por exemplo, após o número 8, você tem 13 espaços seguidos por um retorno de carro (\ n)

UPDATE 2: Opções para limpar a saída. Aqui estão algumas possibilidades que você pode escolher dependendo do seu conhecimento, plano de fundo e dos recursos permitidos em sua área de trabalho:

  • PowerShell - você pode usar os recursos do PS para limpar com facilidade os dados e a saída para um CSV válido (o PS possui recursos nativos do CSV). Isso pode significar aprender PS, claro.
  • Node.JS - minha ferramenta favorita para todas as plataformas! Um host JavaScript de plataforma cruzada que permite executar processos de linha de comando e "servidor". Ele tem um bom acesso ao sistema de arquivos nativo e tem vastas matrizes de bibliotecas para fazer praticamente tudo. Ótimo se você já conhece JavaScript do desenvolvimento web ou deseja minimizar o número de idiomas com os quais você precisa lidar. Além disso, você pode usar o node-webkit para criar UIs de plataforma cruzada com o poder do Nó por trás delas.
  • Windows Scripting Host - também capaz de executar JavaScript (bem, JScript, de qualquer maneira, que esteja próximo). Você também pode usar o VBScript, se necessário. Pode ser executado a partir da linha de comando, desde que não tenha sido desativado por administradores zelosos. Você pode usar o mesmo código em um HTA se precisar de uma interface do usuário.
  • Google Refine - uma ferramenta ETL muito útil para arrumar e transformar dados. Um pouco longo no dente agora e raramente atualizado, mas funciona. Grátis.
  • Excel PowerQuery - um suplemento da Microsoft que é extremamente útil para ETL, desde que o L seja o Excel! Eu uso isso o tempo todo agora. Livre, parte das ferramentas de BI da Microsoft.

Existem muitos outros, claro, estes são apenas alguns exemplos.

    
por 11.06.2015 / 22:53
0

O comportamento do controle de edição é interromper o LF (ao contrário do RTF e das linguagens de programação). Se o LF for precedido por um CR, ambos serão removidos. Embora o CMD esteja escrevendo terminações de linha corretas, a menos que seu código seja incomum.

Set Arg = WScript.Arguments
set WshShell = createObject("Wscript.Shell")
Set Inp = WScript.Stdin
Set Outp = Wscript.Stdout
If LCase(Arg(1)) = "cr" then 
    Do Until Inp.AtEndOfStream
        Line=Inp.readline
        Line=Replace(Line, vbcr, "")
        Line=Replace(Line, vblf, "")
        outp.writeline Line
    Loop
End If
If LCase(Arg(1)) = "lf" then 
    Do Until Inp.AtEndOfStream
        Line=Inp.readline
        Line=Replace(Line, vbcr, vbcrlf)
        outp.writeline Line
    Loop
End If

Para usar

LineBreaks

filter fix {lf|cr}

Corrige problemas com finais de linha.

Diferentes programas consideram finais de linha de maneira diferente. Além disso, o Notepad insere o CR extra estranho que ele ignora, mas outros programas não o fazem.

As linhas são quebradas no caractere de alimentação de linha. Se precedido por um retorno de carro, ambos serão removidos. No entanto, um único retorno de carro sem alimentação de linha não quebra a linha.

cr - removes all stray CR and LF left on each line.
lf - add a LF to any CR embeded in the middle of the line.

Exemplo

Corrige o win.ini, não é necessário corrigi-lo e o envia para a tela

cscript //nologo filter.vbs fix cr < "%systemroot%\win.ini"
    
por 12.06.2015 / 14:23