Analisando arquivos de texto

6

Encontrei uma situação esta noite em que queria analisar um arquivo de texto. Eu tinha uma lista de palavras muito, muito longa, que continha palavras inglesas delimitadas por linhas. Eu queria me livrar de todas as palavras (ou linhas) com mais de 7 caracteres. Isso seria simples no Linux, mas não consigo encontrar uma solução simples no Windows XP. Eu tentei usar a pesquisa de expressão regular do Notepad ++, mas isso foi um grande fracasso. Eu tentei usar a expressão .{6,} sem encontrar correspondências. Estou realmente perdida porque pensei que esse tipo de coisa seria extremamente fácil e haveria toneladas de ferramentas para realizar uma tarefa como essa. Parece que o Notepad ++ suporta todos os outros recursos do mundo, exceto os muito básicos que parecem ser os mais óbvios.

Outro dos meus objetivos era colocar um código antes e depois da palavra em cada linha.

aardvark
apple
azolio

se transformaria em

INSERT INTO Words (word) VALUES ('aardvark');
INSERT INTO Words (word) VALUES ('apple');
INSERT INTO Words (word) VALUES ('azolio');

Quais sugestões / ferramentas / dicas você tem para realizar tarefas semelhantes a esta no Windows XP?

    
por Joe Phillips 22.08.2009 / 06:34

13 respostas

9

Para adicionar o texto SQL, você pode tentar este prompt de comando em um liner:

(for /f %i in (words.txt) do @echo INSERT INTO Words ^(word^) VALUES ^('%i'^)) > words.sql

Para filtrar linhas em um arquivo de texto com mais de 7 caracteres, você pode usar outra ferramenta de linha de comando, findstr:

findstr /v /r ^.........*$ words.txt > shorter-words.txt

A opção / r especifica que você deseja usar correspondência de expressão regular e a opção / v informa para imprimir linhas que não correspondem. (Como parece que o findstr não permite que você especifique um intervalo de contagem de caracteres, eu o falsifiquei com o padrão "8 ou mais" e a opção "não corresponde").

    
por 22.08.2009 / 08:14
6

Com certeza, basta colar esse script e executá-lo no mesmo diretório da lista de palavras. Altere o nome da sua lista de palavras para words.txt ou altere o nome no script. Você pode redirecionar a saída para um novo arquivo da seguinte forma:

words.pl > list.txt

sem mais proveito (junte-o rapidamente, pode ser cortado um pouco):

open FILE, "words.txt" or die $!;

my @words = <FILE>;

foreach $word(@words)
{
    print $word if(length($word) <= 8);
}
    
por 22.08.2009 / 07:08
4

Você pode obter o GNUWin32 sed para o Windows XP.
Da mesma forma, AWK e Perl também.
Isto é, se você está acostumado com o script Unix (se for o caso, considere o Cygwin).

Caso contrário, também há o PowerShell.

    
por 22.08.2009 / 06:50
4

O gVim é uma valiosa ferramenta de edição que tem suas origens no venerável vi usado em sistemas Unix. Você vai querer usar o substituto comando para fazer pesquisa global / substituições para cada palavra.

AWK e Perl são ferramentas muito poderosas, mas exageram no que você precisa. Você vai gostar do gVim, já que é um editor em primeiro lugar. O que acontece com o gVim é que você está a apenas um pressionamento de tecla para dar a ele um comando search / substitute / replace, que pode ser especificado com o formato de expressão regular robusta.
Boa sorte.

    
por 22.08.2009 / 07:02
3

Maciçamente subestimado como uma ferramenta de desenvolvimento é o Microsoft Excel (ou o OpenOffice Spreadsheets). Há um número máximo de linhas, mas você pode aproveitar uma dessas ferramentas.

Depois, você pode usar as funções left, mid, if, etc. na planilha em fórmulas que vão para a direita de suas linhas. Eles serão automaticamente copiados com referências relativas.

Muitas vezes é muito mais fácil do que codificar, a menos que você seja um codificador :) A partir daí, você pode importar, exportar e fazer muitas coisas legais, mesmo com texto.

    
por 22.08.2009 / 12:59
2

Talvez isso seja mais adequado para o StackOverflow , porque o melhor conselho que posso dar é aprender uma das linguagens de script para realizar essas tarefas Mais fácil. É muito melhor conhecer uma ferramenta poderosa do que dezenas de pequenos, IMHO, e é um investimento que vale a pena.

Fazer o download do Python e passar pelo tutorial levará algumas horas, mas depois essas tarefas parecerão muito fáceis para você. Melhor ainda, você aprenderá a reconhecer tarefas "procurando por alguma programação" em outros campos também, e aumentará sua produtividade em dez vezes.

    
por 22.08.2009 / 07:31
2

Eu usaria o TextPad para isso.

Eu usei isso extensivamente para expressões regulares no passado.

Eu tentaria encontrar algo como:

  ^[[:alpha:]]{7,}\n

E substituindo por nada.

    
por 22.08.2009 / 15:25
1

Sua expressão está errada. Você quer isso:

^.{0,6}$

    
por 09.03.2011 / 23:22
1

Eu sei que esta resposta está atrasada, mas acho que vale a pena adicionar, no entanto. Por que vale a pena, você também pode analisar este arquivo de texto usando o Notepad ++ e expressões regulares de forma bastante simples.

Você disse que estava usando a seguinte expressão regular, mas não funcionou:

.{6,}

Esta expressão parece bem e deve corresponder a todas as linhas que contenham 6 ou mais caracteres.

Qual é o tamanho do arquivo de texto? O Notepad ++ pode demorar um pouco para executar expressões regulares em arquivos muito grandes, então é possível que ele não tenha terminado o processamento.

Observação: você afirma que seu objetivo era remover linhas com mais de 7 caracteres - para isso, use a expressão .{8,}

Se tiver certeza de que essa expressão não funcionou, você tem certeza de que seu modo de pesquisa foi definido como Expressão regular e que ". corresponde à nova linha" não foi definido?

Para resolver seu problema, eu executaria as seguintes etapas no notepad ++:

Remover todas as linhas com mais de 7 caracteres Execute um localizar e substituir no Notepad ++ com a seguinte expressão:

Find what:      .{8,}\r?\n?
Replace with:

Isso removerá qualquer linha com mais de 7 caracteres e também removerá os caracteres de nova linha e retorno se presentes.

Substituir palavras por código

Supondo que cada linha simplesmente tenha uma palavra nela (e nenhum espaço à esquerda / à direita ou caracteres indesejados, etc.), isso também pode ser feito com um simples localizar e substituir:

Find What: (.*)                                         //Match the whole line, store in capture group
Replace with: INSERT INTO Words (word) VALUES ('');   //reference value of capure group with 
    
por 11.04.2018 / 12:01
0

Eu segundo usando o Excel para isso.

Coloque todas as suas palavras na coluna A

Coloque esta fórmula na coluna B:

=IF(LEN(A1)>7,"",CONCATENATE("INSERT INTO Words (word) VALUES ('",A1,"')"))

Copie a fórmula para todas as linhas.

Cada linha na coluna B terá seu comando insert do SQL quando o comprimento da palavra for menor que 7. Caso contrário, ele ficará em branco.

Se você quiser remover as linhas em branco, copie e cole como valores da coluna B para outra coluna, depois apenas classifique a coluna. As linhas em branco serão empurradas para o fundo.

    
por 22.08.2009 / 17:49
0

Isso pode ser feito com uma linha de uma linha Perl (se livrando de cada palavra com mais de 7 caracteres):

perl -nle "print if length($_) <= 7" "D:\temp2\input.txt" > ShortWords.txt

Coloque isso em um arquivo BAT ou execute diretamente de um comando janela de linha (Run / cmd).

O Perl deve ser instalado. Eu uso ActivePerl - é muito fácil de instalar, pois tem um instalador normal do Windows. URL de download direto .

Para a segunda parte da sua pergunta (gerando os comandos SQL): é apenas um extensão do primeiro one-liner Perl:

perl -nle "print 'INSERT INTO Words (word) VALUES (\'' . $_ . '\');' if length($_) <= 7" "D:\temp2\input.txt" > SQLcommands.txt

Se ficar mais complicado, provavelmente melhor com um roteiro Perl normal, como sugerido por John T.

    
por 22.08.2009 / 19:30
0

Acredite ou não, mas o Microsoft Word também tem expressões regulares. CTR + H > Mais > Cartão selvagem. A expressão de pesquisa provavelmente será algo como [.]{8+} - pressione F1 enquanto a caixa de diálogo Pesquisar / Substituir é mostrada para ver uma descrição dos regexps do Word.

    
por 28.03.2011 / 21:33
0

Você pode resolver isso sem nenhuma ferramenta extra para baixar usando um pouco de vbScript ou uma macro VBA do Excel. Isso é mais uma pergunta para o stackoverflow.com. O código para esse script seria executado no Excel VBA, bem com quase nenhuma alteração.

Um exemplo de VBA (não testado) pode ser:

Sub filterRows()  
     Dim InputData  
     Open "c:\test.txt" For Input As #1    ' Open file for input.  
     Open "c:\out.txt" For Output As #2  
     Do While Not EOF(1)             ' Check for end of file.  
        Line Input #1, InputData    ' Read line of data.  
        If Len(InputData) <= 7 Then  
            Print #2, InputData  
        End If  
     Loop  
     Close #1    ' Close file.  
     Close #2  

End Sub 
    
por 22.08.2009 / 20:48