C #: Windows App Чтение CSV-файла и запись в консоль - PullRequest
1 голос
/ 18 ноября 2011

У меня есть приложение Windows Forms, которое может запустить консоль для отладки.В приложении через нажатие меню я читаю файл CSV и записываю его в консоль.Функция, которая делает это, приведена ниже.

    protected void menuRead_Click(object sender, EventArgs e)
    {
        // ... functionality to load CSV files
        System.IO.Stream inputDataFile = null;
        OpenFileDialog fd = new OpenFileDialog();
        fd.InitialDirectory = "c:\\";
        fd.Filter = "csv files (*.csv)|*.csv|All files (*.*)|*.*";
        fd.FilterIndex = 1;
        fd.RestoreDirectory = true;
        if (fd.ShowDialog() == DialogResult.OK)
        {
            try
            {
                if ((inputDataFile = fd.OpenFile()) != null)
                {
                    inputData_exists = true;
                    // ... read input data from CSV file
                    using (CsvFileReader reader = new CsvFileReader(inputDataFile))
                    {
                        CsvRow row = new CsvRow();
                        while (reader.ReadRow(row))
                        {
                            foreach (string s in row)
                            {
                                Console.Write(s);
                                Console.Write(" ");
                            }
                            Console.WriteLine();
                        }

                        // ... close the input data stream
                        inputDataFile.Close();
                    }
                }
            }
            catch (Exception err)
            {
                //Inform the user if can't read the file
                MessageBox.Show(err.Message);
            }
        }
    }

Все отлично работает, кроме следующего: Файл CSV содержит около 1200 строк кода.Когда этот код выполняется, окно OpenFileDialog () закрывается только частично, прежде чем содержимое файла csv начинает записываться в окно консоли.Итак, я могу видеть запись данных в консольное окно, и у меня есть небольшая прямоугольная часть диалогового окна, отображаемая в моей форме.Есть ли способ убедиться, что диалоговое окно закрыто до того, как данные будут записаны на консоль?Должен ли я открыть новую ветку для связи с консолью?Любой совет или помощь woulf будет принята с благодарностью.Спасибо.

Ответы [ 3 ]

0 голосов
/ 18 ноября 2011

Вы можете использовать много подходов здесь.Самый простой: использовать StringBuilder, а затем поместить все данные сразу.Потому что вывод на консоль может быть довольно медленным.

StringBuilder consoleBuffer = new StringBuilder();
using (CsvFileReader reader = new CsvFileReader(inputDataFile))
{
    CsvRow row = new CsvRow();
    while (reader.ReadRow(row))
    {
        foreach (string s in row)
        {
            consoleBuffer.Append(s);
            consoleBuffer.Append(" ");
        }
        consoleBuffer.Append(Environment.NewLine);
    }

    Console.WriteLine(consoleBuffer.ToString());

    // ... close the input data stream
    inputDataFile.Close();
}
0 голосов
/ 18 ноября 2011

Вам необходимо дать некоторое время для перерисовки элемента управления «OpenFileDialog» во время удаления элемента управления. Самый простой способ для WinForm - это использовать Application.DoEvents ()

if (fd.ShowDialog() == DialogResult.OK)
{      
    Application.DoEvents();
    ...
    ...
}
0 голосов
/ 18 ноября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...