Ordenar cada linha autônoma em ordem alfabética

1

Eu quero classificar alguns itens em ordem alfabética, mas de uma maneira muito específica.

Eu tenho, por exemplo, a seguinte lista, cada item separado por vírgula:

monkeys, big dogs, cats
pineapple, banana, orange
yellow, red, blue, green
silver, gold, platinum
delphi, java, c++, visual basic

Um item aqui é definido pela parte do texto: 1. começando no começo de uma linha e terminando logo antes da primeira vírgula; 2. cercado por vírgulas e 3. começando logo após a última vírgula e terminando no final da linha. Então os espaços não são separadores, como em "big dogs" forma um único item.

Quero classificar cada linha em ordem alfabética, SEM alterar a ordem das linhas.

Meu resultado desejado seria:

big dogs, cats, monkeys
banana, orange, pineapple
blue, green, red, yellow
gold, platinum, silver
c++, delphi, java, visual basic

Minha lista de alvos tem mais de 3.000 linhas, portanto, deve ser um processo automatizado.

Obrigado!

Daniel
fonte
Qual sistema operacional você está usando?
Daniel Beck
Estou usando o Windows 7, mas também tenho o cygwin instalado.
Daniel
Alguém pode me ajudar?
Daniel
Você conhece alguma linguagem de programação? Perl ou Python poderiam fazer isso facilmente. Perl seria minha primeira escolha, sendo esta uma tarefa de processamento de texto. Qualquer linguagem de programação poderia fazer isso, no entanto. Não deve demorar mais de meia hora no máximo.
Jack M
Eu código em java e delphi, mas sinto python ou perl me daria esses resultados facilmente, não é?
Daniel

Respostas:

1

Powershell um forro:

$sep=","; gc infile.txt |% {$line=($_ -split $sep)|% {$_.trim()}|sort;$line -join $sep} >outfile.txt

Notas:
1. Usa PS 2 join sintaxe, que é mais compacta.
2. Usando , como separador (como mostrado) removerá todos os espaços iniciais / finais das palavras. Isso é o que eu suponho do contexto que você quer, mas se eu pegasse sua descrição literalmente, eles deveriam ser mantidos . Se você desejar, remova |% {$_.trim()} (mas então sort não funcionará "como esperado" para o seu exemplo com espaços iniciais
3. Você pode usar ,<space> (ou qualquer outra coisa, como matéria) como separador de saída ( -join ", ") isso normalizará qualquer entrada mista (com ou sem espaços após a vírgula) para a que você selecionou.
4. A codificação padrão para saída no PS é Unicode (UTF-16). Você pode mudá-lo usando | out-file -Encoding <encoding_type> em vez de redirecionamento > se você precisa controlar isso. Para ver as codificações disponíveis, execute help out-file -full

wmz
fonte
Obrigado pela resposta. Sim, você está certo, eu quero cortar a linha de entrada, mas não a saída. Assim, o separador real é ", & lt; espaço & gt;" Eu mudei para (-join ",") e funcionou. No entanto, eu tenho outro problema: eu tenho algumas palavras contendo caracteres como "á", "é" e "ó" no começo. Com esse comando do powershell, esses itens são classificados antes de "a" em ordem alfabética. Deveria ser assim "a, á, b, c, d, e, é, f, g" ... etc.
Daniel
@ Daniel Eu não sei em que configurações regionais você executá-lo, funcionou para mim para cada um que eu tentei. De qualquer forma, você poderia usar sort -culture para alterar o agrupamento (por exemplo, sort -culture en-us para inglês dos EUA). Pode ser também um problema com a codificação do arquivo de entrada, mas você provavelmente veria 'lixo' como resultado.
wmz
Perfeito! Eu estabeleço -culture -en-us e funciona perfeitamente! Muito obrigado!
Daniel
@ Daniel Fico feliz que funcionou! Eu adicionei um ponto sobre a codificação apenas no caso de você precisar configurá-lo para algo diferente do padrão.
wmz
1

Aqui está um que deveria fazê-lo em python.

import csv

f = open("sortrows.csv", 'rb')
reader = csv.reader(f)

outf = open("sortedrows.csv", 'w')
for row in reader:
    row.sort()
    outf.write(",".join(row) + "\n")

f.close()
outf.close()
Ryan
fonte
Não vai o print(row) retardá-lo um pouco?
Jack M
Obrigado pela resposta. Isso me dá um comprimento de 0 bytes "sortedrows.csv".
Daniel
O que devo fazer?
Daniel
@JackM Isso é verdade. Deixei isso da minha depuração.
Ryan
Ele ainda dá um 0-byte sortedrows.csv quando eu executo este script. Eu tenho o python 3.3.0 instalado. Qual é o problema?
Daniel