Localiza / substitui uma coluna específica em um arquivo grande com vários padrões

0

Eu tenho um arquivo CSV de 100 GB. Parece algo assim:

11,aa,gg,tt
ew,11,rggr,tr

E um segundo que especifica substituições (20.000 linhas neste arquivo):

gg,q
aaa,b

O que eu quero fazer é passar por cima de cada linha no primeiro arquivo e substituir o valor da terceira coluna se aparecer no segundo arquivo (por exemplo, substitua gg por q neste caso). Observe que isso ocorre somente se a string inteira aparecer na terceira coluna. Então, para o exemplo atual, o resultado seria:

11,aa,q,tt
ew,11,rggr,tr

Qual seria uma boa maneira de conseguir isso?

    
por jack 17.11.2016 / 17:01

1 resposta

1

Dado o tamanho de seus arquivos, eu escolheria escrever isso em uma linguagem como Perl ou Python para que eu pudesse carregar o arquivo de substituição na memória (em um hash ou dicionário para pesquisas rápidas) e depois analisar a linha principal do arquivo csv por linha. Aqui está um exemplo em Python de como fazer isso, supondo que seus arquivos csv foram chamados de "replace.csv" para as substituições e "big.csv" para o arquivo csv principal.

#!/usr/bin/python
import csv
import sys

repl = dict()

# Load replacements into memory
with open("replace.csv", "r") as csvfile:
    reader = csv.reader(csvfile, delimiter=',')
    for row in reader:
        if len(row) >= 2:
            repl[row[0]] = row[1]

# Do the replacements
with open("big.csv", "r") as csvfile:
    reader = csv.reader(csvfile, delimiter=',')
    writer = csv.writer(sys.stdout)
    for row in reader:
        if len(row) >= 3:
            if row[2] in repl:
                    row[2] = repl[row[2]]
            writer.writerow(row)
    
por 17.11.2016 / 21:13

Tags