Search code examples
c#readfile

Read lines of data from CSV then display data


I have to read info from a txt file, store it in a manner (array or list), then display the data. Program must include at least one additional class. I've hit a wall and can't progress.

string, string, double, string name,badge,salary,position name,badge,salary,position name,badge,salary,position

I'm sorry and I know the code below is disastrous but I'm at a loss and am running out of time.

namespace Employees
{
    class Program
    {
        static void Main()
        {
            IndividualInfo collect = new IndividualInfo();

            greeting();
            collect.ReadInfo();
            next();
            for (int i = 0; i < 5; i++)
            {
                displayInfo(i);
            }
            exit();

            void greeting()
            {
                Console.WriteLine("\nWelcome to the Software Development Company\n");
            }
            void next()
            {
                Console.WriteLine("\n*Press enter key to display information . . . *");
                Console.Read();
            }
            void displayInfo(int i)
            {
                Console.WriteLine($"\nSoftware Developer {i + 1} Information:");
                Console.WriteLine($"\nName:\t\t\t{collect.nameList[i]}");
            }
            void exit()
            {
                Console.WriteLine("\n\n*Press enter key to exit . . . *");
                Console.Read();
                Console.Read();
            }
        }
    }
}

class IndividualInfo
    {
        public string Name { get; set; }
        //public string Badge{ get; set; }
        //public string Position{ get; set; }
        //public string Salary{ get; set; }

        public void ReadInfo()
        {
            int i = 0;
            string inputLine;
            string[] eachLine = new string[4];
            string[,] info = new string[5, 4]; // 5 developers, 4x info each
            StreamReader file = new StreamReader("data.txt");
            while ((inputLine = file.ReadLine()) != null)
            {
                eachLine = inputLine.Split(',');
                for (int x = 0; x < 5; x++)
                {
                    eachLine[x] = info[i, x];
                    x++;
                }
                i++;
            }
            string name = info[i, 0];
            string badge = info[i, 1];
            string position = info[i, 2];
            double salary = Double.Parse(info[i, 3]);
        }

        public List<string> nameList = new List<string>();
    }

So far I think I can collect it with a two-dimensional array, but a List(s) would be better. Also, the code I've posted up there won't run because I can't yet figure out a way to get it to display. Which is why I'm here.


Solution

  • using System.IO;
    
    static void Main(string[] args)
    {
        using(var reader = new StreamReader(@"C:\test.csv"))
        {
            List<string> listA = new List<string>();
            List<string> listB = new List<string>();
            while (!reader.EndOfStream)
            {
                var line = reader.ReadLine();
                var values = line.Split(';');
    
                listA.Add(values[0]);
                listB.Add(values[1]);
            }
        }
    }
    

    https://www.rfc-editor.org/rfc/rfc4180

    or

    using Microsoft.VisualBasic.FileIO;
    
    var path = @"C:\Person.csv"; // Habeeb, "Dubai Media City, Dubai"
    using (TextFieldParser csvParser = new TextFieldParser(path))
    {
     csvParser.CommentTokens = new string[] { "#" };
     csvParser.SetDelimiters(new string[] { "," });
     csvParser.HasFieldsEnclosedInQuotes = true;
    
     // Skip the row with the column names
     csvParser.ReadLine();
    
     while (!csvParser.EndOfData)
     {
      // Read current line fields, pointer moves to the next line.
      string[] fields = csvParser.ReadFields();
      string Name = fields[0];
      string Address = fields[1];
     }
    }
    

    http://codeskaters.blogspot.ae/2015/11/c-easiest-csv-parser-built-in-net.html

    or

    LINQ way:

    var lines = File.ReadAllLines("test.txt").Select(a => a.Split(';'));
    var csv = from line in lines
              select (from piece in line
                      select piece);
    

    ^^Wrong - Edit by Nick

    It appears the original answerer was attempting to populate csv with a 2 dimensional array - an array containing arrays. Each item in the first array contains an array representing that line number with each item in the nested array containing the data for that specific column.

    var csv = from line in lines
              select (line.Split(',')).ToArray();
    

    This question was fully addressed here:

    Reading CSV file and storing values into an array