Transformar Largura Fixa para CSV?

4

Eu tenho um monte de arquivos de dados com conteúdo diferente, mas layout idêntico. Preciso convertê-los em CSV antes de importá-los para um aplicativo CRM.

Normalmente, abro o arquivo delimitado por tabulação no Excel, o que me pede para definir manualmente as paradas de tabulação usando o Assistente de importação de texto. Depois de abrir o arquivo, eu o converto em CSV.

O problema é que eu tenho um monte desses arquivos (digamos 20-30) e o Excel não lembra o que se faz no Assistente de Importação de Texto e por razões muito longas para explicar aqui eu não posso simplesmente combiná-los todos em um arquivo em massa - mesmo que a estrutura de dados seja idêntica.

Gostaria de saber se existe um programa ou processo lá fora que me permita salvar um "modelo" da estrutura do arquivo de dados e, em seguida, aplicá-lo em cada arquivo, para que eu não precise recriá-lo manualmente?

    
por Dave Mackey 25.08.2011 / 16:44

6 respostas

3

Para isso eu normalmente usaria um processo em lote em uma linguagem de script

Por exemplo, isso é AutoIt:

$getfile = FileOpenDialog("Choose a file",@ScriptDir, "*.tsv",7)
If StringInSTr($getfile,"|") = 0 Then
    $split = StringSplit($getfile,"|")
    For $i = 2 to $split[0]
        $file = FileOpen($split[$i])
        StringReplace($split[$i],@TAB,",")
        FileClose($split[$i])
    Next
Else
    $file = FileOpen($getfile)
    StringReplace($file,@TAB,",")
    FileClose($file)
EndIf

Isso seria tão fácil em VBScript, Batch, Python ou Perl.

    
por 25.08.2011 / 17:06
0

Quais ferramentas você tem à sua disposição? Por exemplo, você está limitado à GUI do Windows ou, digamos, tem uma conta shell do Linux? você pode fazer o download de lixo arbitrário ou está limitado ao que está na sua estação de trabalho?

Se nada mais, que tal abrir os arquivos no Word / wordpad / notepad e apenas fazer uma pesquisa global e substituir, substituindo as abas por vírgulas? Ou talvez com "," , se o seu conjunto de dados contiver vírgulas.

    
por 25.08.2011 / 16:55
0

Eu costumo usar Textpad para esse tipo de coisa, como eu posso pesquisar e substituir usando expressões regulares, então eu troco as abas por vírgulas . Talvez uma abordagem semelhante possa ajudar no seu cenário

    
por 25.08.2011 / 16:56
0

Se as colunas de dados estiverem separadas por uma ou mais guias, cada

perl -p -i.bak -e "s/\t+/,/g" filenames

em que filenames pode ser *.tsv , por exemplo, ou uma lista de nomes de arquivos.

Se as colunas de dados estiverem separadas por caracteres de espaço e nenhum dos dados reais incluir espaços

perl -p -i.bak -e "s/\s+/,/g" filenames

Se os dados puderem conter espaços, escreveria um script um pouco mais complexo usando subscript ou unpack com base em uma lista de posições ou larguras de coluna. Poste um pequeno exemplo de linhas reais de dados e resultados desejados.

    
por 25.08.2011 / 17:35
0

Se você está no Windows e tem o PowerShell instalado , você pode usar este one-liner para obter todos os arquivos .CSV a pasta atual, importe-os como um arquivo "delimitado por tabulação" ('t) e exporte-os como CSVs reais com o mesmo nome, mas prefixados com "New -":

(get-childitem "*.csv" | foreach ($_) { ($newName="New-"+$_.name) -and (Import-Csv $_.fullname -Delimiter "'t" | Export-Csv .\$newName -notype) }) -and (Remove-Variable "newName")

Para esclarecer / criar scripts, aqui ele está dividido em várias linhas:

get-childitem "*.csv" | foreach ($_) { 
    $newName="New-"+$_.name
    Import-Csv $_.fullname -Delimiter "'t" | Export-Csv .\$newName -notype
    }
Remove-Variable "newName"
    
por 25.08.2011 / 18:43
-1

Usando uma macro, você poderá salvar o tipo de delimitador de largura fixa em csv.

A partir daí, é relativamente fácil analisar um diretório inteiro de arquivos, abrindo-os como largura fixa e salvando-os como csv.

Você pode escrever uma macro que processe todos os arquivos em um determinado diretório dessa maneira, salvando-os em um diretório de saída assim que eles forem convertidos.

    
por 25.08.2011 / 16:54