none
matriz en txt pasarla a c# RRS feed

  • Pregunta

  • Buenas tardes amigos/as.

    Tengo un txt con las notas de los alumnos con el siguiente formato:

    1,2,3,4,5,6,7,8

    9,10,11,12,13,14,15,16

    17,18,19,20,21,22,23,24

    ....

    que representan a los alumnos ( en las filas) y las notas ( en las columnas). Son números enteros, separados por comas. La cantidad de filas es variable y la cantidad de columnas es de 8.

    Quiero trabajar tanto con las filas como con las columnas para sacar la media, nota máxima, hacer estadística, etc. Mi idea es abrir el fichero con openFileDialog e importar los datos para posteriormente operar con ellos. Pero desconozco si es mejor tratarlos como array, arrayList, List, objeto u otro procedimiento. Espero vuestro consejo. Gracias.

    Me surgen dos dudas:

    1.- una vez tenga ese array, arrayList, List o lo que sea en c#, ¿cómo lo llamo para trabajar con él?

    2.- ¿una vez cargado, cómo puedo visualizar los valores en el array o lo que sea?, es decir, de qué modo puedo ver la fila X, columna 5, por ejemplo? Con excel sé que se hace con la ventana locales, pero en c# lo desconozco.

    El código que tengo es este:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;


    namespace NotasAlumnos

    {
            public partial class Form1 : Form
        {
                private string string_open;

                public Form1()
            {
                InitializeComponent();
            }

            private void button1_Click(object sender, EventArgs e) // Abrir archivo
            {
                openFileDialog1.Filter = "Text file (*.txt)|*.txt|All file(*.*)|*.*";
                if (openFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    string_open = openFileDialog1.FileName;
                    textBox1.Text = System.IO.File.ReadAllText(string_open); // Colocar archivo en textBox
                }
            }
        }
    }

    martes, 27 de marzo de 2018 18:44

Respuestas

  • Aquí una idea.

    int[] t = new int[5] { 1, 2, 3, 4, 5};
    using (StreamWriter writer = new   StreamWriter("prueba.txt", false))
    {
      for (int i = 0; i < t.Length; i++)
      {
        writer.WriteLine(t[i].ToString());
      }
    }

    Suerte.


    http://electronica-pic.blogspot.com

    martes, 27 de marzo de 2018 19:01

Todas las respuestas

  • Aquí una idea.

    int[] t = new int[5] { 1, 2, 3, 4, 5};
    using (StreamWriter writer = new   StreamWriter("prueba.txt", false))
    {
      for (int i = 0; i < t.Length; i++)
      {
        writer.WriteLine(t[i].ToString());
      }
    }

    Suerte.


    http://electronica-pic.blogspot.com

    martes, 27 de marzo de 2018 19:01
  • El 99% de las veces, la respuesta correcta es modelar los registros en una clase.  El detalle que veo aquí es que dice que son notas de alumnos, pero parece que el archivo no contiene los nombres de dichos alumnos.  ¿Cómo va a emparejar cada fila en el archivo con un alumno?

    Jose R. MCP
    Code Samples

    martes, 27 de marzo de 2018 20:07
    Moderador
  • Puedes hacerlo de varias maneras, con un array de dos dimensiones, listas, tuplas, etc.

    - Con un array de dos dimensiones:

    string[] lines = File.ReadAllLines(@"D:\NotasAlumnos.txt", Encoding.Default);
    int[,] notes = new int[lines.Count(), 8];
    
    for (int r = 0; r < lines.Count(); r++)
    	for (int c = 0; c < 8; c++)
    		notes[r, c] = Convert.ToInt32(lines[r].Split(',')[c]);
    
    //Por ejemplo:
    int cuartaNotaPrimerAlumno = notes[0, 3];
    double promedioTodasNotas = notes.Cast<int>().Average();
    int sumaNotasSegundoAlumno = 0;
    for (int c = 0; c < notes.GetLength(0); c++)
    	sumaNotasSegundoAlumno += notes[1, c];

    martes, 27 de marzo de 2018 22:35
  • Así es, Jose R. MCP, gracias por la respuesta.

    El archivo txt solo tiene los valores de las calificaciones (expresados en números enteros) y separados por comas. Las filas no están vinculadas a los nombres de los alumnos y las columnas tampoco están vinculadas al nombre de la asignatura correspondiente. La matriz del txt solo contiene datos númericos separados por comas.

    La idea es trabajar con las X filas y las 8 columnas al estilo excel (en el VBA de excel no tengo problema para hacerlo, pero estoy iniciandome en c#, y estoy muy perdida).Gracias.

    Por cierto, que es eso de modelar los registros de una clase?

    miércoles, 28 de marzo de 2018 0:07
  • Hola Georgina.  Usted verá:  Cuando manejamos datos, manejamos el concepto de registro, que es un dato o una agrupación lógica de datos que suele repetirse según la necesidad.  En su caso el registro al que me refiero son esas 8 notas.  Pero un mejor registro sería esas 8 notas y un identificador de alumno, como por ejemplo, su nombre completo o su número de identificación nacional.  Eso es lo que yo consideraría un registro "completo".

    Entonces ¿qué es esta "clase" de la que hablo?  Bueno, C# es un lenguaje de programación orientado a objetos.  Uno de sus pilares, por lo tanto, es la habilidad de modelar datos y funciones en objetos.  ¿Cómo se crean los objetos?  A partir de "clases".  Hay una analogía muy buena:  Clase es a plano como objeto es a edificio.  Quiere decir que las clases son como planos de construcción, y los edificios construidos siguiendo dichos planos de construcción son los objetos.  Un plano puede usarse para crear más de un edificio (todos ellos idénticos), y es lo mismo con las clases y objetos.

    Entonces volvamos al registro.  Lo ideal, para mí, es que tuviera una clase que modela sus datos:

    public class RegistroNotas
    {
        #region Propiedades
        public string Alumno { get; set; } //Nombre del alumno.
        public short[] Notas { get; set; } //Notas del alumno.  Esto es un arreglo de números enteros.
        #endregion
    }

    Conforme usted lee las notas desde el archivo de texto, cada línea es un registro.  Entonces podemos crear un objeto para cada línea.

    //Queremos almacenar todas las líneas en una colección.
    List<RegistroNotas> todasLasNotas = new List<RegistroNotas>();
    using (StreamReader sr = new StreamReader("archivo.txt"))
    {
        //Leemos línea por línea.
        string linea;
        while ((linea = sr.ReadLine()) != null)
        {
            //Creamos el objeto que modela nuestros registros.
            RegistroNotas r = new RegistroNotas();
            //Ahora convertimos el texto leído en un arreglo de números.
            string[] strNotas = linea.Split(',');
            short[] notas = new short[strNotas.Length];
            //Convertimos texto a número.
            for (int i = 0; i < notas.Length; ++i)
            {
                notas[i] = Convert.ToInt16(strNotas[i]);
            }
            //Asignamos las notas a nuestro objeto.
            r.Notas = notas;
            //Finalmente, agregamos nuestro nuevo objeto a nuestra colección.
            todasLasNotas.Add(r);
        }
    }
    

    Este ejemplo únicamente coloca las notas, a pesar de que la clase RegistroNotas también puede almacenar la identificación del alumno en su propiedad Alumno.  Lo hice así porque no sé cómo hará usted para aparejar las fils con los alumnos.


    Jose R. MCP
    Code Samples

    miércoles, 28 de marzo de 2018 1:33
    Moderador
  • Tiene usted toda la razón José R. Gracias por su explicación. El formato correcto del txt sería el siguiente:

    alumno/asignatura, asig1,asig2,asig3,asig4,asig5,asig6,asig7,asig8

    alumno1,1,2,3,4,5,6,7,8

    alumno2,9,10,11,12,13,14,15,16

    alumno3,17,18,19,20,21,22,23,24

    ...

    alumnoX,91,92,93,94,95,96,97,98

    Sin embargo, con esta presentación ideal del fichero, tendría en la misma linea y misma columna ( a excepción de la linea de índice cero y de la columna de índice 0) datos string y enteros. Para evitarlo, he decidido modificar el fichero y eliminar los string y quedarme solo con los enteros. Me resulta más fácil empezar así (trabajar solo con un tipo de datos) y a medida que vaya progresando iré dando un pasito más.

    Necesito "estudiar y comprender" bien su código para poder asimilar correctamente los conceptos.

    Nuevamente gracias a Willams Morales, Metaconta y Jose R. y saludos a todos.

    miércoles, 28 de marzo de 2018 14:15