none
Посимвольное считывание из текстового файла C# RRS feed

  • Вопрос

  • Доброго времени суток!)
    Пожалуйста дайте совет, нужно посимвольно считать из файла текст и записать считанную инфу в массив структур.
    Во время дебага нашел проблему в указанных ниже условиях не проходит проверка, в чем дело не пойму.

    Вот мой код:

    static public void Load(Employee[] Mas)
            {
                int i = 0;
                char[] buffer = new char[1];
                string testcom = ",";
                char[] comma = testcom.ToCharArray();
                string testline = "|";
                char[] line = testline.ToCharArray();
                int count = 0;
                StringBuilder result = new StringBuilder();

                FileInfo fi = new FileInfo(@"путь...");

                try
                {
                    if (fi.Exists)
                    {
                        using (FileStream fstream = fi.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                        {
                            using (StreamReader reader = new StreamReader(fstream, Encoding.UTF8))
                            {
                                while (reader.Read(buffer, 0, buffer.Length) != 0)
                                {
                                    if (buffer == line)// Тут проверка на наличие в записанном текстовом файле символа "|" если он есть то счетчик должен увеличиться  и запись должна уже начаться в следующий элемент массива структур(Условие игнорируется)
                                    {
                                        i++;
                                        Array.Clear(buffer, 0, buffer.Length);
                                        continue;
                                    }
                                    if (buffer != comma)// Та же история ,запятыми я разделил элементы структуры, чтобы при считывании мог определить что и куда записывать. Когда в файле встречается запятая опять же полный игнор ,условие не выполняется и просто идет запись в одну строку
                                    {
                                        result.Append(buffer);
                                        Array.Clear(buffer, 0, buffer.Length);
                                    }
                                    else
                                        if (buffer == comma)
                                        {
                                            Array.Clear(buffer, 0, buffer.Length);
                                            count++;
                                        }
                                    switch (count)
                                    {
                                        case '1':
                                            Mas[i].Numb = convert(buffer);
                                            break;
                                        case '2':
                                            Mas[i].Name = buffer.ToString();
                                            break;
                                        case '3':
                                            Mas[i].Surname = buffer.ToString();
                                            break;
                                        case '4':
                                            Mas[i].Patronymic = buffer.ToString();
                                            break;
                                        case '5':
                                            Mas[i].Day = convert(buffer);
                                            break;
                                        case '6':
                                            Mas[i].Month = convert(buffer);
                                            break;
                                        case '7':
                                            Mas[i].Year = convert(buffer);
                                            break;
                                        case '8':
                                            Mas[i].Salary = convert(buffer);
                                            break;
                                    }

                                }
                            }
                        }
                        Console.WriteLine("Файл успешно загружен...");
                        Console.ReadKey();
                    }
                    else
                    {
                        Console.WriteLine("Файл отсутствует");
                        Console.ReadKey();
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine("Неудалось запустить процесс: {0}", e.ToString());
                    Console.ReadKey();
                }
            }

            static public int convert(char[] Mas)
            {
                string tmp = Mas.ToString();
                int buf = int.Parse(tmp);
                return buf;
            }

    10 апреля 2015 г. 20:01

Ответы

Все ответы

  • Для начала это самый медленный и сложный способ загрузки CSV файла. Куда проще считывать по строкам, разбивать строки на части по запятым и т.д...

    Ну а не работает это потому что массивы сравниваются не поэлементно, а по ссылке. т.е.:

    var foo = new char[] { '1' };

    var bar = new char[] { '1' };

    if (bar == foo)

    {

    // Никогда не выполняется.

    }

    Самый простой способ исправить - убрать ненужные массивы и использовать вариант Read() который возвращает int (который затем можно кастить в Char если значение неотрицательное).

    Но как я сказал лучше поменять весь код.


    This posting is provided "AS IS" with no warranties, and confers no rights.

    10 апреля 2015 г. 22:57
    Модератор
  • Я просто записываю в текстовый файл.
    Если не сложно приведите ваш пример в виде кода или ссылочку какую-нибудь толковую) 
    И возможно ли как-то мой код подкорректировать?
    11 апреля 2015 г. 11:13
  •             using (var stream = File.OpenText("some.csv"))
                {
                    string line;
    
                    while ((line = stream.ReadLine()) != null)
                    {
                        var columns = line.Split(',');
    
                        // Тут данные для каждого столбца присвоить полям структуры
                    }
                }
    


    This posting is provided "AS IS" with no warranties, and confers no rights.

    12 апреля 2015 г. 23:04
    Модератор