Ir para conteúdo
Fórum Script Brasil
  • 0

Ordenar Uma Arquivo


Guest Danilo

Pergunta

Tenho um arquivo no seguinte formato:

Teste1 3

Teste2 1

Teste3 2

Separando a 1º coluna da 2º, há um <TAB>, ou seja, a linha esta assim: "Teste1\t3\n\0"

Gostaria de ordenar esse arquivo, para deixar dessa forma:

Teste1 3

Teste3 2

Teste2 1

já criei alguns algoritmos proprios mas nenhum deu certo... Como eu poderia ordenar esse arquivo?

Obrigado

Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

Esse é o meu algoritmo que fiz ate agora....

short sOrdena(char *szNomeArq)

{

FILE *fpArqSaida, *fpArqOrd;

int iQtdLinha = 0, iValor1 = 0, iValor2 = 0, iTamLinha = 0, iCont = 0,

iCont2 = 0, iCont3 = 0, iCont4 = 0, iParam = 0;

char szLinha1[TAMPALAVRA] = {0}, szLinha2[TAMPALAVRA] = {0},

szValor1[TAMPALAVRA] = {0}, szValor2[TAMPALAVRA] = {0};

iQtdLinha = (sVerificaQtdLinha(szNomeArq) - 1);

iParam = strcmp("desc", szParam);

fpArqSaida = fopen(szNomeArq, "r+");

for (iCont = 0; iCont <= iQtdLinha; iCont++)

{

fgets(szLinha1, TAMPALAVRA, fpArqSaida);

iTamLinha = strlen(szLinha1);

for (iCont2 = 0; iCont2 <= iTamLinha; iCont2++)

{

if (szLinha1[iCont2] == '\t')

{

int iPos = 0;

iCont2++;

while (szLinha1[iCont2] != '\n')

{

szValor1[iPos] = szLinha1[iCont2];

iCont2++;

iPos++;

}

iValor1 = atoi(szValor1);

}

}

fpArqOrd = fopen(szNomeArq, "r+");

while (!feof(fpArqOrd))

{

fgets(szLinha2, TAMPALAVRA, fpArqOrd);

iTamLinha = strlen(szLinha2);

for (iCont3 = 0; iCont3<= iTamLinha; iCont3++)

{

if (szLinha2[iCont3] == '\t')

{

int iPos = 0;

iCont3++;

while (szLinha2[iCont3] != '\n')

{

szValor2[iPos] = szLinha2[iCont3];

iCont3++;

iPos++;

}

iValor2 = atoi(szValor2);

}

}

if (iValor1 < iValor2)

{

fseek(fpArqOrd, -35, SEEK_CUR);

fprintf(fpArqOrd, "%s", szLinha2);

fprintf(fpArqOrd, "%s", szLinha1);

fseek(fpArqOrd, -35, SEEK_CUR);

}

}

fclose(fpArqOrd);

}

fclose(fpArqSaida);

}

szNomeArq é o nome do arquivo a ser ordenado.

Acho que minha logica está errada, pois ele fica num loop infinito.... acho que deve ser alguma coisa com o fseek, mas não sei o que é....

Se alguém puder dar alguma ajuda... Valeu!!!

Link para o comentário
Compartilhar em outros sites

  • 0

Não sei se entendi bem o problema.

Fiz aqui um que ordena pela segunda coluna. :)

#include <stdio.h>
#define MAX_TAM_LINHA 300
#define MAX_NUM_LINHAS 20
#define swap(x,y) x^=(y^=(x^=y))

int main(int argc, char ** argv)
{
    int i, j, n_linhas = 0;
    char linha_atual[MAX_TAM_LINHA];
    char *linhas[MAX_NUM_LINHAS];
    
    FILE *arquivo = fopen("entrada.txt", "r");
    if(!arquivo) return 1;

    // Le as linhas e coloca num vetor
    while(fgets(linha_atual, MAX_TAM_LINHA, arquivo)) {
        linhas[n_linhas] = (char*) malloc(strlen(linha_atual) * sizeof(char));
        strcpy(linhas[n_linhas], linha_atual);
        linhas[n_linhas][strlen(linha_atual) - 1] = '\0';
        n_linhas++;
    }
    
    // Le os numeros da segunda coluna e guarda em outro vetor
    char tmp[200];
    int numeros[n_linhas], original[n_linhas];
    for(i = 0; i < n_linhas; i++) {
        sscanf(linhas[i], "%s %d", tmp, &numeros[i]);
        original[i] = i;
    }
    
    // Ordena de maneira muito ineficiente..
    for(i = 0; i < n_linhas - 1; i++) {
        for(j = i+1; j < n_linhas; j++) {
            if(numeros[i] < numeros[j]) {
                swap(numeros[i], numeros[j]);
                swap(original[i], original[j]);
            }
        }
    }
    
    // Exibe as linhas na ordem correta
    for(i = 0; i < n_linhas; i++) {
        printf("%s\n", linhas[original[i]]);
    }    
    
    return 0;
}
Só uma observação: C/C++ são péssimas linguagens para se fazer coisas simples como estas. Você precisa cuidar da alocação da memória, dos bytes, dos ponteiros, etc. Algumas linguagens script conseguem fazer o serviço de uma forma bem mais limpa. Veja como seria o mesmo programa em Python:
n_linhas = 0
arquivo = open('entrada.txt', 'r')

# Le as linhas e coloca num vetor
linhas = []
for linha_atual in arquivo:
    linhas.append(linha_atual)
    n_linhas = n_linhas + 1

# Le os numeros da segunda coluna e guarda em outro vetor
numeros = []
for linha_atual in linhas:
    palavras = linha_atual.split("\t")
    numeros.append(int(palavras[1]))
numeros = zip(numeros, range(0, len(numeros)))

# Ordena de forma eficiente
numeros.sort()
numeros.reverse()

# Exibe as linhas na ordem correta
for n in numeros:
    print linhas[n[1]],

Té mais.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...