Ir ao conteúdo

Posts recomendados

Postado

Pessoal, eu tenho o seguinte problema: tenho um arquivo de dados .csv. Eu preciso ler linha por linha desse arquivo e salvar elas em um outro arquivo, porém linhas com lixo (caracteres especiais que sejam diferentes de ';' ou '.') devem ser ignoradas. Como posso fazer isso?

 

Linha sem lixos (Mantidas em um outro arquivo):

20190106;1200;25.8;83;1009.1;5;4.5

Linha com Lixos (Devem ser ignoradas):
20190106;180*;31.*;77;1005.0;5;5.0

  • Obrigado 1
Postado

@Hiago Martins    você pode pegar linha por linha usando o comando fgets para pegar uma linha  , e em seguida verifique nessa linha cada caractere se algum deles for diferente de ponto_e_vírgula (  ; )     ou  ponto  (   .   )   e que não seja letras maiúsculas ou minúsculas ou números de zero até 9 ,   então não coloque essa linha no outro arquivo e passe para a linha seguinte ,  até o final do arquivo ( EOF ) .   poste seu código para vermos como está e em que podemos ajudar  .

  • Curtir 1
Postado

@Hiago Martins Olá. Passando para a prática o que o @devair1010 falou, para ler o arquivo linha por linha com o fgets seria isso:

#include <stdio.h>
#include <stdlib.h>

int main() {

    FILE *arq_entrada;
    char linha[150];

    arq_entrada = fopen("arq_topico.cvs", "r");

    while (fgets(linha, 150, arq_entrada) != NULL) {
        printf("%s", linha);
    }

    fclose(arq_entrada);

    return 0;
}

 

Postado

@Hiago Martins     para ignorar não precisa fazer nada ,  mas a comparação seria de outra forma , por exemplo assim  :

while (fgets(linha, 150, arq_entrada) != NULL) {
    for(p=0;linha[p]!='\n';p++){/* barra n ( \n )  pois o final da linha é o caractere newline */
        flag=0;      /* variável de controle */
        if(isalnum(linha[p])==false && linha[p]!= ';' && linha[p]!='.'){/* verifica se tem apenas caractere válidosd */
            flag=1;  /* encontrou algum caractere que não pode ter */
        }
    }    

    if( ! flag )     /* se flag não for diferente de zero */
        fprintf(arquivo_saida,"%s",linha);/* coloca no arquivo  */

    /* continua o loop , para pegar a próxima linha , e indo assim até o final do arquivo */

}

 

  • Obrigado 1
Postado

@devair1010 @r_Tray

Meu código funcionou, mas tive que fazer algumas mudanças. Só que agora tenho outro problema... eu não posso ter datas ou horas inválidas, como por exemplo:

 

20190106;1200;25.8;83;1009.1;5;4.5

A data é 20190106 e a hora é 1200, isso está correto. Porém, se a data for 21090106 ou a hora 1890 a linha também deve ser ignorada... Como posso fazer isso????

 

  • Curtir 1
Postado

@Hiago Martins Olá. Essa foi a forma que resolvi o exercício do tópico (o primeiro, não da data e hora

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int main() {

    FILE *arq_entrada, *arq_saida;
    char linha[150];
    int i, validado;

    arq_entrada = fopen("arq_topico.csv", "r");
    arq_saida = fopen("arq_saida_topico.csv", "w");

    while (fgets(linha, 150, arq_entrada) != NULL) {
        for (i = 0; i < linha[i] != '\0'; i++) {
            validado = 0;
            if (linha[i] == '.' || linha[i] == ';' || isdigit(linha[i]) || isalpha(linha[i])) {
                validado = 1;
            }
            if (!validado) {
                break;
            }
        }
        if (validado) {
            fprintf(arq_saida, "%s", linha); // grava a linha no arquivo de saída (linha válida)
        }
    }

    fclose(arq_entrada);
    fclose(arq_saida);

    return 0;
}

 

Qualquer dúvida é só perguntar, ok? :)

Forte abraço!

 

Postado

@r_Tray @devair1010 Criei esse código com duas funções que "limpam" o meu arquivo. Eles estão funcionando corretamente, visto que elas estão retornando os valores corretos. Porém, quando eu faço uso da função conf_data_time a minha saida fica: 2 2 2 😅 Me ajudem por favor!!!!!

#include <stdio.h>
#include <ctype.h>
#include <locale.h>
#include <stdlib.h>



char linha[50];

int conf_lixo(char texto[50]){ //função que confere se há lixo nas linhas do arquivo
	int p;
	int confere = 0;
	for(p=0; texto[p] != '\n'; p++){
			
		if(isdigit(texto[p])==false && texto[p]!= ';' && texto[p]!='.') confere++; //confere se o carcter é diferente de um número decimal e difere de ";" ou "."		
	}
	
	if(confere != 0) return 1;
	if(confere == 0) return 0;
}

int conf_data_time(char horadata[50]){ //função que confere se a data e a hora são válidas

int teste = 0; 

if((horadata[0]!='2') || (horadata[1]=!'0') || (horadata[2]!='1') || (horadata[3]!='9')) teste++; //confere se o ano é válido
if(((horadata[4]-'0')>1) || (horadata[4] == '1' && (horadata[5]-'0')>2)) teste++; //confere se o mês é válido
if((horadata[6] == '3') && ((horadata[7]-'0')>1)) teste++; //confere se o dia é válido

if(((horadata[9]-'0')>2) || (horadata[9]=='2' && (horadata[10]-'0')>3)) teste++; //confere se as horas são válidas
if((horadata[11]-'0')>5) teste++; //confere se os minutos são válidos*/

if (!teste) return 0; // se data e hora forem validas, retorna 0
if(teste > 0) return 1; // se data ou hora for invalida, retorna 1

}


int main(){
	
	setlocale(LC_ALL,"portuguese");
	
	FILE*entrada; FILE*saida;
	
	entrada = fopen("dados.csv", "r");
	
	if(entrada == NULL){
		
		printf("ERRO - Não foi possível abrir o arquivo dados! \n Os dados anteriores foram mantidos!");
		system("pause");
		return 1;
		
	}
	
	else{
	
	saida = fopen("dadosCorrigidos.csv", "w");
	
	}
	
	fgets(linha, 50, entrada);
	
	while(!feof(entrada)){
		
		int x = conf_lixo(linha);
		int y = conf_data_time(linha);
		
		
		//printf("%d  %d \n", x, y);
		
		if ((x+y) == 0){
		
		 puts(linha);
		 fgets(linha, 50, entrada);
	}
		 
		else{
		
			fgets(linha, 50, entrada);	
			
		}		
	}
	
	fclose(entrada); fclose(saida);
	printf("ÊXITO - O arquivo está livre de lixos!\n");
	system("pause");
	return 0;
}

 

  • Curtir 1
Postado

@r_Tray e @devair1010 Terminei meu código pessoal. Muito obrigado mesmo pela ajuda de vocês.

Ele ficou assim:

#include <stdio.h>
#include <ctype.h>
#include <locale.h>
#include <stdlib.h>

char linha[50];
char nome_in[50];
char nome_out[50];

int conf_lixo(char texto[50]){ //função que confere se há lixo nas linhas do arquivo

	int p;
	int confere = 0;
	for(p=0; texto[p] != '\n'; p++){
			
		if(isdigit(texto[p])==false && texto[p]!= ';' && texto[p]!='.') confere++; //confere se o carcter é diferente de um número decimal e difere de ";" ou "."		
	}
	
	if(confere != 0) return 1;
	if(confere == 0) return 0;
}

int conf_data_time(char horadata[50]){ //função que confere se data e hora são válidas

int teste = 0; 

if((horadata[0]!='2') && (horadata[1]=!'0') && (horadata[2]!='1') && (horadata[3]!='9')) teste++; //confere se o ano é válido
if(((horadata[4]-'0')>1) || (horadata[4] == '1' && (horadata[5]-'0')>2)) teste++; //confere se o mês é válido
if((horadata[6] == '3') && ((horadata[7]-'0')>1)) teste++; //confere se o dia é válido

if(((horadata[9]-'0')>2) || (horadata[9]=='2' && (horadata[10]-'0')>3)) teste++; //confere se as horas são válidas
if((horadata[11]-'0')>5) teste++; //confere se os minutos são válidos*/

if (!teste) return 0; // se data e hora forem validas, retorna 0
if(teste > 0) return 1; // se data ou hora for invalida, retorna 1

}

int main(){
	
	setlocale(LC_ALL,"portuguese");
	
	FILE*entrada; FILE*saida;
	
	printf("Digite o nome (+ .csv) do arquivo que será limpo de dados corrompidos: "); //solicita o nome do arquivo que será limpo
	scanf("%s", &nome_in);
	printf("Digite o nome (+ .csv) do arquivo  onde os dados limpos serão salvos: "); //solicita o nome do arquivo em que os dados limpos serão salvos
	scanf("%s", &nome_out);
	
	entrada = fopen(nome_in, "r");
	
	if(entrada == NULL){ 
		
		printf("ERRO - Não foi possível abrir o arquivo dados! \n Os dados anteriores foram mantidos!");
		system("pause");
		return 1;
		
	}
	
	else{
	
	saida = fopen(nome_out, "w");
	
	}
	
	fgets(linha, 50, entrada);
	
	while(!feof(entrada)){
		
		int x = conf_lixo(linha);
		int y = conf_data_time(linha);
		
		if ((x+y) == 0){
		
		 fputs(linha, saida);
		 fgets(linha, 50, entrada);
	}
		 
		else{
		
			fgets(linha, 50, entrada);		
		}		
	}
	
	fclose(entrada); fclose(saida);
	printf("ÊXITO - O arquivo está livre de lixos!\n");
	system("pause");
	return 0;
}

 

  • Curtir 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!