Filtrar entradas em um arquivo de texto grande com base na Whitelist

0

Bom dia. Eu realmente poderia usar sua ajuda neste. Eu tenho um arquivo de texto de estatísticas no seguinte formato.

 ID=1000000 
 Name=Name1
 Field1=Value1 
 ...(Fields 2 to 25)
 Field26=Value26 

 ID=1000001
 Name=Name2
 Field1=Value1 
 ...(Fields 2 to 25) 
 Field26=Value26

 ID=1000002
 Name=Name2
 Field1=Value1 
 ...(Fields 2 to 25) 
 Field26=Value26 

 ...goes up to 15000

Eu tenho um arquivo de texto de pessoas ativo separado por quebras de linha.

 Name2
 Name5
 Name11
 Name12 
 ...goes up to 1400 Random Names

Eu preciso excluir registros do arquivo de texto de estatísticas (ID, Nome, Campos1 a 26) se o nome não for encontrado no arquivo de texto de pessoas ativo. No exemplo acima, o registro associado a Name1 (ID, Name, Fields1 a 26) deve ser excluído, pois não está no arquivo de texto de pessoas ativo.

Eu tentei reformatar o arquivo de estatísticas por meio do notepad ++ usando TextFX- > Quick- > Localizar / Substituir para convertê-lo em um arquivo separado por vírgulas com cada registro separado por uma quebra de linha. Eu tinha rearranjado para

 ID       Name    Field1  ...Fields2 to Fields 25... Field26
 1000000  Name1   Value1  ...Value2 to Value 25...   Value26
 1000001  Name2   Value1  ...Value2 to Value 25...   Value26
 1000002  Name3   Value1  ...Value2 to Value 25...   Value26

Eu abri com excel e criei duas tabelas (stats table e active names table) no mysql usando o arquivo csv. Não sei como processar isso em uma função automática. Além de remover registros inativos, o outro problema que tenho é reescrevê-lo de volta ao formato antigo.

Eu tenho tentado o meu melhor para descobrir isso por horas a fio. Existe uma solução que não exige que eu use find, copy, paste e alterne entre os dois arquivos 1400 vezes? Estou aberto a usar diferentes métodos / programas para simplificar o processo. Infelizmente, tenho que manter o arquivo de estatísticas neste formato.

Eu bati em uma parede nesta. Por favor ajude. Obrigado.

    
por Krispy K 18.10.2011 / 19:30

2 respostas

1

Em praticamente qualquer sistema BSD ou Linux (eu escrevi isso no OS X) você pode usar o seguinte script bash filter.sh :

#!/bin/bash
if [ ! -f "$1" ] ; then
    echo "First argument must be active users list file"
    exit 1
fi
while read line
do
    if [ "$( grep -E "^$( echo $line | cut -d' ' -f2 )$" "$1" )" ]  ; then
        echo $line
    fi
done

Armazene sua lista de usuários ativos originais como active.txt e o arquivo de estatísticas modificado stats.txt Make filter.sh executable usando chmod +x filter.sh e execute-o:

$ < stats.txt ./filter.sh active.txt | tee result.txt
1000001 Name2 Value1 ...Value2 to Value 25... Value26

Ele imprimirá as entradas de estatísticas ativas na saída padrão e as gravará em result.txt .

    
por 18.10.2011 / 19:48
0

Edit: Eu interpretei erroneamente a parte sobre csv na pergunta. Eu estava apenas tentando discutir a porção de saída.

O Excel não é um paradigma de banco de dados / conjunto de registros. Em vez de excel, você pode usar o Access ou, talvez, algo como o Base do OpenOffice ( link ). Importe os arquivos como tabelas, vincule as tabelas, faça [magic], exporte novos arquivos.

No Access, uma maneira crazy para gerar o arquivo é criar uma consulta que construa a string que você deseja:

Select
"ID=" & [id] & chr(13) & chr(10) & 
"Name=" & [Name1] & chr(13) & chr(10) & 
( ... )
"Field26=" & [Value26] & chr(13) & chr(10) & 
FROM fooTable

Em seguida, salve-o e exporte-o para um arquivo de texto. Isso criará uma consulta com um campo por registro. O 13 + 10 é a combinação de retorno de linha e alimentação de linha do Windows.

Não elegante.

    
por 18.10.2011 / 21:14

Tags