Substituição de strings em arquivos grandes

2

Eu tenho dois arquivos TSV ( separado por tabulação ) - file_A.txt e file_B.txt

file_A.txt contém duas colunas - A_ID , A_Name

file_B.txt contém 4 colunas - B_ID1 , B_Name1 , B_ID2 , B_Name2

É necessário passar por cada A_ID , se corresponder a B_ID1 ou B_ID2 , substituir B_Name1 ou B_Name2 por A_Name de acordo.

Estou procurando uma maneira eficiente de fazer isso, pois file_B tem algumas centenas de MB.

Alguma sugestão?

    
por Joan 31.08.2016 / 23:59

1 resposta

0

Supondo que você queira as substituições no formato file_B.txt, como Spike sugeriu, um banco de dados leve como o sqlite poderia fazer isso.

O seguinte seria ler file_A.txt e file_B.txt em um banco de dados transiente na memória e exibir os resultados no arquivo TSV MODIFIED-file_B.txt

sqlite3 -separator $'\t' << EOF  > MODIFIED-file_B.txt
CREATE TABLE a ( id INTEGER PRIMARY KEY, name );
.import file_A.txt a
CREATE TABLE b (id1 INTEGER,name1 TEXT,id2 INTEGER,name2 TEXT);
.import file_B.txt b
SELECT b.id1,
       ifnull((SELECT name from a WHERE a.id=b.id1),b.name1),
       b.id2, 
       ifnull((SELECT name from a WHERE a.id=b.id2),b.name2)
FROM b;
EOF

Isto lê cada arquivo em uma tabela separada, em seguida, imprime a tabela b com suas substituições A, se disponíveis, caso contrário, retorna o nome B_nome original.

Se o uso de memória for uma preocupação, você poderá executá-lo com um nome de arquivo, por exemplo. sqlite3 -separator $'\t' temporary.db para criar um arquivo de rascunho.

    
por 03.09.2016 / 02:49

Tags