Fórum Ubuntu Linux - PT
Suporte Técnico => Programação e Scripts => Tópico iniciado por: gabrieldlm em 06 de Abril de 2012, 01:16
-
Ola pessoal,
Estou com um problema , tenho um arquivo csv com n(numero de linhas variavel) linhas e 15 colunas, como faço pra guardar os números ( todos os dados são números) em uma matriz pra poderem ser manipulados posteriormente. Pensei em utilizar matlab octave ou afins mas preciso de rapidez.
Se alguem puder dar uma luz...
-
Isso deve ser fácil de fazer em Python.
Por exemplo, suponha que você tenha um arquivo de texto chamado dados.txt com o conteúdo abaixo
1, 2, 3
4, 5, 6
7, 7, 7
Você pode lê-lo e interpretar o resultado como uma matriz (um array bidimensional) em Python apenas com as duas linhas abaixo
import numpy
a = numpy.loadtxt('dados.txt', delimiter=',')
Se a função loadtxt do numpy não for suficiente, você pode usar o módulo "csv" que serve exatamente para isso (nunca usei, mas parece ser bem poderoso).
-
Pois é, eu tinha pensado em Python ,C# e Java tambem, mas é que eu vou ter que rodar uns 100 programas assim ao mesmo tempo =/ e o cluster da faculdade (infelizmente) não é só pra mim nem só pra graduação....
-
Leia linha por linha, crie/use uma função pra separar por tokens (tipo a strtok), e grave no novo formato.
-
Então, acho que ta acontecendo algum estouro de memoria , porque quando ele vai imprimir o resultado de cada elemento (pra checar se ta tudo certo) ele imprime valores do tipo 0 4195230 -1209374720, sendo que todos são maiores que 1 e menores que 1000. Se puder dar uma luz seria muito bom
#include <stdio.h>
#define LINHA 725
#define COLUNA 15
int main(){
int i,j,k;
int *matrix[LINHA][COLUNA];
int *vet[25];
FILE *data;
data = fopen("data.txt","r");
for(i=0;i<LINHA;i++){
for(j=0;j<COLUNA;j++){
fscanf(data,"%d",&matrix[i][j]);
printf("%d\n",matrix[i][j]);
}
}
fclose(data);
for(i=0;i<LINHA;i++){
for(j=0;j<COLUNA;j++){
for(k=1;k<26;k++){
if(&matrix[i][j] == k){
vet[k]=vet[k]++;
}
}
}
}
return 0;
}
-
Você está tentando ler um arquivo e interpretar seu conteúdo como uma matriz usando o fscanf. Apenas o fscanf não é muito robusto e o arquivo tem que estar exatamente no formato esperado. Nesse caso em particular, as diferentes colunas devem estar separadas apenas por espaços e não pode ter ",", por exemplo. Caso contrário você obterá esses números estranhos.
Consegui ler um arquivo (chamado dados.txt) com o conteúdo abaixo
1 2 4
4 5 6
7 7 7
8 8 10
9 9 11
com o seguinte código (pequenas mudanças no seu código)
#include <stdio.h>
#define LINHA 5
#define COLUNA 3
int main()
{
int i,j,k;
int matrix[LINHA][COLUNA];
int vet[25];
FILE *data;
data = fopen("dados.txt","r");
for(i=0;i<LINHA;i++){
for(j=0;j<COLUNA;j++){
fscanf(data,"%d", &matrix[i][j]);
printf("%d\n",matrix[i][j]);
}
}
fclose(data);
printf ("%s\n","Arquivo fechado");
for(i=0;i<LINHA;i++)
{
for(j=0;j<COLUNA;j++)
{
for(k=1;k<26;k++)
{
if(matrix[i][j] == k)
{
vet[k]=vet[k]++;
}
}
}
}
return 0;
}
-
Vlw , mas está tendo o mesmo problema do código anterior , ele consegue lidar até com umas 300 linhas, mas acima disso dá o mesmo problema
EDIT: na verdade era um erro bobo era so aumentar o tamanho do vet[] problema resolvido
-
Talvez isso ajude:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#define MAX_COLUMNS 15
int tmpline[MAX_COLUMNS]; /* Contém uma linha temporária */
int **matrix = NULL; /* Eis a matriz */
int num_lines = 0; /* Numero de linhas da matriz. */
/* Funções auxiliares */
int *add_line(void);
int readline(FILE *, int *);
int main(int argc, char **argv)
{
FILE *f;
int *p;
f = fopen(argv[1], "rt");
if (f == NULL)
{
fprintf(stderr, "Error opening input file.\n");
return EXIT_FAILURE;
}
while (readline(f, tmpline))
{
p = add_line();
if (p == NULL)
{
fprintf(stderr, "Error allocating line.\n");
memcpy(p, tmpline, MAX_COLUMNS * sizeof(int));
}
}
fclose(f);
/* Neste ponto, seu array de int's deve conter a matriz */
return EXIT_SUCCESS;
}
int readline(FILE *f, int *data_ptr)
{
int i;
char buffer[1024];
char *p;
if (fgets(buffer, 1024, f) != NULL)
{
p = strtok(buffer, ",");
for (i = 0; p != NULL && i < MAX_COLUMNS; i++)
{
data_ptr[i] = atoi(p);
p = strtok(NULL, ",");
}
return 1;
}
return 0;
}
int *add_line(void)
{
int **p, *p2;
int n;
n = num_lines + 1;
p = realloc(matrix, sizeof(int *)*n);
if (p == NULL)
return NULL;
p2 = malloc(sizeof(int)*MAX_COLUMNS);
if (p2 == NULL)
return NULL;
matrix = p;
matrix[num_lines] = p2;
num_lines = n;
return p2;
}