Поиск одной строки данных по номеру идентификатора, а затем печать на консоль из CSV - PullRequest
1 голос
/ 27 апреля 2020

Я C# новичок ie, и я пытаюсь создать систему управления клиентами для проекта, в котором я хочу найти клиента по идентификационному номеру, пропустить строку заголовка, а затем распечатать искомую строку на экране. прежде чем пользователь продолжит. Мой CSV-файл настроен так:

[ID] [Заголовок] [Имя] [Фамилия] [Пол] [ДОБ]

[0 ] [Миссис] [Джейн] [Доу] [Женщина] [01.01.1990]

[1] [Мистер] [Джон] [Доу] [Мужчина] [1 / 1/1991]

[2] [Ms] [Сара] [Доу] [Женский] [01.01.2010]

и т. Д. ...

У меня такое ощущение, что я могу использовать inFile.Seek неправильно или recordIn не получает правильные данные для работы, потому что он печатает только WriteLine выше inFile.Seek(0, SeekOrigin.Begin);

Я отформатировал код и поместил туда все, что вам нужно, чтобы его было легче отлаживать:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {

        static void Main(string[] args)
        {
            const char DELIM = ',';
            const double END = 000;
            const string FILENAME = "D:\\customers.csv";
            Customer cus = new Customer();
            FileStream inFile = new FileStream(FILENAME, FileMode.Open, FileAccess.Read);
            StreamReader reader = new StreamReader(inFile);
            string recordIn;
            string[] fields;
            int idNum;
            Write("  **Type " + END + " To Quit** Enter Customer ID Number> ");
            idNum = Convert.ToInt32(ReadLine());
            while (idNum != END)
            {
                WriteLine("{0,5}{1,10}{2,15}{3,15}{4,15}{5,25}\n", "ID", "Title", "First Name", "Last Name", "Gender", "DOB");
                inFile.Seek(0, SeekOrigin.Begin);
                reader.ReadLine();
                recordIn = reader.ReadLine();
                while (recordIn != null)
                {

                    fields = recordIn.Split(DELIM);

                    cus.ID = Convert.ToInt32(fields[0]);
                    cus.Title = fields[1];
                    cus.FirstName = fields[2];
                    cus.LastName = fields[3];
                    cus.Gender = fields[4];
                    cus.DOB = fields[5];

                    if (cus.ID == idNum)
                        WriteLine("{0,5}{1,10}{2,15}{3,15}{4,15}{5,25}\n", cus.ID, cus.Title, cus.FirstName, cus.LastName, cus.Gender, cus.DOB);
                    recordIn = reader.ReadLine();

                }
                Console.Write("  **Type " + END + " To Quit** Enter Customer ID Number> ");
                idNum = Convert.ToInt32(ReadLine());
            }
            reader.Close();
            inFile.Close();
        }

        public class Customer
        {
            public int idNum { get; set; }
            public string Title { get; set; }
            public string FirstName { get; set; }
            public string LastName { get; set; }
            public string Gender { get; set; }
            public DateTime DOB { get; set; }
        }


    }
}

Любая помощь будет оценена :))

1 Ответ

0 голосов
/ 27 апреля 2020

FileStream.Seek breaks StreamReader, потому что StreamReader имеет собственный внутренний буфер. Поэтому вам не следует повторно использовать StreamReader, вы должны создать новый после вызова FileStream.Seek

. Здесь приведен пример, который не использует StreamReader и использует некоторый код Linq:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        public class Customer
        {
            public int idNum { get; set; }
            public string Title { get; set; }
            public string FirstName { get; set; }
            public string LastName { get; set; }
            public string Gender { get; set; }
            public DateTime DOB { get; set; }
        }

        static void Main(string[] args)
        {
            const char DELIM = ';';
            const int END = 0;
            const string FILENAME = "D:\\customers.csv";
            using (FileStream inFile = new FileStream(FILENAME, FileMode.Open, FileAccess.Read))
            {
                while (true)
                {
                    Console.WriteLine("  **Type " + END + " To Quit** Enter Customer ID Number> ");
                    var idNum = Convert.ToInt32(Console.ReadLine());
                    if (idNum == END) break;
                    inFile.Position = 0;
                    Console.WriteLine("{0,5}{1,10}{2,15}{3,15}{4,15}{5,25}\n", "ID", "Title", "First Name", "Last Name", "Gender", "DOB");
                    foreach (var customer in GetCustomers(inFile, DELIM).Where(x => x.idNum == idNum))
                    {
                        Console.WriteLine("{0,5}{1,10}{2,15}{3,15}{4,15}{5,25}\n", customer.idNum, customer.Title, customer.FirstName, customer.LastName, customer.Gender, customer.DOB);
                    }
                }
            }
        }

        static IEnumerable<Customer> GetCustomers(Stream input, char separator)
        {
            using (var reader = new StreamReader(input))
            {
                // read header
                reader.ReadLine();

                while (true)
                {
                    var line = reader.ReadLine();
                    if (line == null) yield break;
                    var fields = line.Split(separator);
                    yield return new Customer
                    {
                        idNum = Convert.ToInt32(fields[0]),
                        Title = fields[1],
                        FirstName = fields[2],
                        LastName = fields[3],
                        Gender = fields[4],
                        DOB = Convert.ToDateTime(fields[5])
                    };
                }
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...