Ram _Varman Ответов: 2

Как сохранить данные в текстовом файле только в формате столбца?


Привет,

У меня есть графический интерфейс, и я получаю данные значений данных из Uc. Я могу видеть данные в поле rich text и сохранять их в текстовый файл. Но я не могу понять, как сортировать сохраненные данные в формате столбца. Сейчас это длинный ряд данных. Пожалуйста, совет.

Было бы целесообразно заменить форматированное текстовое поле обычным текстовым полем? Это изображение сохраненных данных в текстовом файле: https://i.imgur.com/swgT4er.jpg[^]
и это в окне терминала: https://i.imgur.com/L0CDo5H.png[^]
Вход-это температура, посылаемая контроллером. Контроллер запускает демонстрационный код и передает температуру по последовательному каналу. Спасибо.

У меня есть кнопка для сохранения данных в текстовый файл (button3_Click);

Что я уже пробовал:

using System;
using System.Windows.Forms;
using System.IO.Ports;
using System.IO;
namespace Serial_receive
{
    public partial class Form1 : Form
    {
        // All members variables should be placed here
        // make it more readable, hopefully!
        string t;
        SerialPort sp;

        public Form1()
        {
            InitializeComponent();
            Control.CheckForIllegalCrossThreadCalls = false;

            // User can already search for ports when the constructor of the FORM1 is calling 
            // And let the user search ports again with a click
            // Searching for ports function

            SearchPorts();
        }
       //search button  
        private void button1_Click(object sender, EventArgs e)
        {
            comboBox1.Items.Clear();
            SearchPorts();
        }
        void SearchPorts()
        {
            string[] ports = SerialPort.GetPortNames();
            foreach (string port in ports)
            {
                comboBox1.Items.Add(port);
            }
        }
  
        private void button2_Click(object sender, EventArgs e)
        {
            // Catch exception if it will be thrown so the user will see it in a message box
            OpenCloseSerial();
        }      
        void OpenCloseSerial()
        {
            try
            {
                if (sp == null || sp.IsOpen == false)
                {
                    t = comboBox1.Text.ToString();
                    sErial(t);
                    button2.Text = "Close Serial port"; // button text
                }
                else
                {
                    sp.Close();
                    button2.Text = "Connect and wait for inputs";   // button text

                }
            }
            catch (Exception err)   // catching error message
            {
                MessageBox.Show(err.Message);   // displaying error message
            }           
        }
      
        void sErial(string Port_name)
        {
            try
            {
                sp = new SerialPort(Port_name, 115200, Parity.None, 8, StopBits.One);   // serial port parameters
                sp.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
                sp.Open();
            }
            catch (Exception err)
            {
                throw (new SystemException(err.Message));
            }
        }
//
        private  void DataReceivedHandler(object sender,SerialDataReceivedEventArgs e)
        {

            // This below line is not need , sp is global (belongs to the class!!)
            //SerialPort sp = (SerialPort)sender;
            if (e.EventType == SerialData.Chars)
            {
                if (sp.IsOpen)
                {
                    string w = sp.ReadExisting();
                    if (w != String.Empty)
                    {
                       // Text += "\r\n";
                        Invoke(new Action(() => richTextBox1.AppendText(w)));
                    }
                }
            }
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (sp == null || sp.IsOpen == false)
            {
                OpenCloseSerial();
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            this.Text = "Serial Channel to FRDM-KW40Z";
        }
        //public void SaveMyFile()
        //{
        //    // Create a SaveFileDialog to request a path and file name to save to.
        //    SaveFileDialog saveFile1 = new SaveFileDialog();

        //    // Initialize the SaveFileDialog to specify the RTF extension for the file.
        //    String fileName = "C:\\Users\varman\\Desktop\\Test.rtf"; //set this to your file you want
        //    saveFile1.DefaultExt = "*Test.rtf";
        //    saveFile1.Filter = "RTF Files|*.rtf";

        //    // Determine if the user selected a file name from the saveFileDialog.
        //    if (saveFile1.ShowDialog() == System.Windows.Forms.DialogResult.OK &&
        //       saveFile1.FileName.Length > 0)
        //    {
        //        // Save the contents of the RichTextBox into the file.
        //        richTextBox1.SaveFile(saveFile1.FileName, RichTextBoxStreamType.PlainText);
        //    }
        //}

        private void button3_Click(object sender, EventArgs e)
        {
            SaveFileDialog saveFileDialog1 = new SaveFileDialog();
            saveFileDialog1.InitialDirectory = @"C:\Users\varman\Documents\";
            saveFileDialog1.Title = "Save text Files";
            saveFileDialog1.CheckFileExists = true;
            saveFileDialog1.CheckPathExists = true;
            saveFileDialog1.DefaultExt = "txt";
            saveFileDialog1.Filter = "Text files (*.txt)|*.txt|All files (*.*)|*.*";
            saveFileDialog1.FilterIndex = 2;
            saveFileDialog1.RestoreDirectory = true;

            if (saveFileDialog1.ShowDialog() == DialogResult.OK)
            {
                Text += "\r\n";
                File.WriteAllText(saveFileDialog1.FileName, richTextBox1.Text);
                richTextBox1.Text = saveFileDialog1.FileName;
            }
        }

        private void richTextBox1_TextChanged(object sender, EventArgs e)
        {
            
        }
    }
}

[no name]

Вы ведь понимаете, что текстовые файлы не имеют "столбцов", верно?

PIEBALDconsult

Помимо всего прочего, вам нужно узнать о разделении забот.

Ram _Varman

Да! Я надеюсь узнать это, помимо всего прочего, и быстрее :)
А пока, пожалуйста, помогите. У меня сложилось впечатление, что Text += "\r\n" в поле DataReceivedHandler решит проблему форматирования. Я думаю, что могу манипулировать сохраненными данными до того, как они будут записаны в текстовый файл. Но я не уверен, должен ли я делать это в DataReceivedHandler или button3_Click. Будет ли достаточно одного этого куска? Основываясь на комментарии @NotPoliticallyCorrect, возможно ли это вообще? Спасибо.

Patrice T

Вы понимаете, что забыли показать свои входные данные и желаемый результат ?

Ram _Varman

Это изображение сохраненных данных в текстовом файле: https://i.imgur.com/swgT4er.jpg
и это в окне терминала: https://i.imgur.com/L0CDo5H.png
Вход-это температура, посылаемая контроллером. Контроллер запускает демонстрационный код и передает температуру по последовательному каналу. Спасибо.

Patrice T

Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.
Чтобы каждый мог обратить внимание на эту информацию.
Копирование текста ввода и вывода, нет необходимости в изображениях

2 Ответов

Рейтинг:
2

Patrice T

Ваша проблема заключается в том, что EOL, используемый вашим устройством, не распознается вашим текстовым редактором.
Используйте текстовый редактор, который может отображаться в шестнадцатеричном режиме и искать символ перед "температурой", это не пробел.
Другое решение-заменить этот EOL одним стандартом в windows.
Новая Строка-Википедия[^]


Рейтинг:
1

Valery Possoz

Привет,

То.Свойство text элемента управления richtextbox-это не хорошо для вас.

Вместо этого используйте .Линии

File.AppendAllLines(@"c:\temp\test1.txt", richTextBox1.Lines);


То есть потому, что то .Свойство Text использует \n для указания новой строки, а в текстовом файле этого недостаточно.

Попробуйте это отладить:
File.WriteAllText(@"c:\temp\test2.txt", richTextBox1.Text);
File.AppendAllLines(@"c:\temp\test1.txt", richTextBox1.Lines);
File.WriteAllText(@"c:\temp\test3.txt", richTextBox1.Text.Replace("\n",Environment.NewLine));

Валери.