Combina vários arquivos .csv com comprimentos diferentes em um único

0

Eu tenho um problema semelhante ao Mesclar o conteúdo de vários arquivos .csv em um único arquivo .csv , mas para diferentes comprimento de arquivos csv.

O que devo adicionar ao script perl nesta resposta , para contabilizar o tamanho diferente do csv arquivos?

Se você souber como fazer isso de qualquer outra forma, sinta-se à vontade para sugerir isso.

    
por Anthony 07.02.2018 / 17:44

3 respostas

1

paste -d, 1.csv 2.csv | sed 's/^,//; s/,$//' > out.csv deve fazer o truque

paste será mesclado por coluna na ordem dos arquivos especificados. Para manter o formato csv -d, é usado. No entanto colar trata uma linha vazia como uma entrada e irá inserir vírgulas. Isso é removido com o comando sed .

Isso também executará a mesma tarefa da pergunta vinculada.

    
por 07.02.2018 / 18:51
0

Aqui está um hack usando o awk para garantir que todas as linhas recebam o mesmo número de campos.

Suponho que o primeiro arquivo csv tenha o número máximo de linhas: não funcionará se não for esse o caso.

$ cat 1.csv
a,b,c
d,e,f
g,h,i

$ cat 2.csv
foo,bar
baz,qux

$ paste -d, {1,2}.csv
a,b,c,foo,bar
d,e,f,baz,qux
g,h,i,

$ paste -d, {1,2}.csv | awk -F, -vOFS=, 'NR == 1 {n = NF} NF < n {NF = n} 1'
a,b,c,foo,bar
d,e,f,baz,qux
g,h,i,,

Isso pode requer o GNU awk para configurar o NF var.

    
por 07.02.2018 / 19:45
0

Não foi possível resistir a criar um pequeno script Python para isso. Salvar em um arquivo, por exemplo mergecols.py , torne-o executável e a saída de

./mergecols.py 2.csv 1.csv 1.csv 2.csv 2.csv 1.csv

será

foo,bar,a,b,c,a,b,c,foo,bar,foo,bar,a,b,c
baz,qux,d,e,f,d,e,f,baz,qux,baz,qux,d,e,f
,,g,h,i,g,h,i,,,,,g,h,i

(com 1.csv e 2.csv de outra resposta). Aqui está o script:

#!/usr/bin/env python
import sys

fileNames = sys.argv[1:]
files = [ open(n, "rt") for n in fileNames ]
numberOfColumns = [ None ] * len(fileNames)
while True:
    newParts = [ ]
    foundEntries = False
    for idx in range(len(files)):
        line = files[idx].readline()
        if line:
            parts = line.strip().split(",")
            if numberOfColumns[idx] is None:
                numberOfColumns[idx] = len(parts)
            else:
                if numberOfColumns[idx] != len(parts):
                    raise Exception("Number of columns in '{}' changed".format(fileNames[idx]))
            newParts += parts
            foundEntries = True
        else:
            if numberOfColumns[idx] is None:
                raise Exception("{} does not appear to contain lines".format(fileNames[idx]))
            newParts += [ "" ] * numberOfColumns[idx]

    if not foundEntries:
        break
    sys.stdout.write(",".join(newParts) + "\n")
    
por 07.02.2018 / 20:29

Tags