Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
ked
1 / 1 / 0
Регистрация: 10.07.2014
Сообщений: 102
1

Запись в файл через BinaryWriter

01.10.2014, 21:40. Просмотров 322. Ответов 1
Метки нет (Все метки)

Здравствуйте! Помогите пожалуйста, суть проблемы такова. Сделан парсинг файла csv. RowsCount передан на форму в два NumericUpDown и ReadCsvFile() в checkedListBox. Данные ниже:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
        /// <summary>Разделитель, используемый в CSV-файле</summary>
        public const char SEPARATOR = ';';
        /// <summary>Номер строки с именами столбцов в CSV-файле</summary>
        private const int NAMES_LINE_INDEX = 7;
        private string fileName;
        /// <summary>Имя CSV-файла</summary>
        public string FileName{
            get { return fileName; }
        }
        private float adcRate;
        /// <summary>Частота дискретизации</summary>
        public float AdcRate{
            get { return adcRate; }
        }
        private string columnNames;
        /// <summary>Имена столбцов</summary>
        public string ColumnsNames{
            get{return columnNames;}
        }        
        /// <summary> Максимальный номер строки </summary>
        public int RowsCount{
            get{return lastLineWithData - firstLineWithData + 1;}
        }
        /// <summary> Номер строки, с которой начинаются данные </summary>
        private int firstLineWithData;
        /// <summary> Номер строки, которой данные заканчиваются </summary>
        private int lastLineWithData;
        private long startPosition;
        /// <summary> Позиция в потоке, c которой данные начинаются </summary>
        public long StartPosition{
            get { return startPosition; }
        }
        private long endPosition;
        /// <summary> Позиция в потоке, на которой данные заканчиваются </summary>
        public long EndPosition{
            get { return endPosition; }
        }
        string lines;
        /// <summary> Параметр чтения строк файла </summary>
        public string LINES{
            get { return lines; }
        }
 
        private DataTable csvData;//Таблица с данными из CSV-файла
 
        /// <summary>Конструктор, принимающий имя CSV-файла для обработки</summary>
        public CSVProcess(string filename)
        {
            this.fileName = filename;
        }
 
        /// <summary> Чтение имён столбцов </summary>
        public string[] ReadCsvFile(){
            try{
                using (StreamReader sr = new StreamReader(fileName, Encoding.Default)){
                    while ((columnNames = sr.ReadLine()) != null){
                        if (columnNames.StartsWith("Names")){
                                break;
                        }
                    }                   
                }
            }
            catch (Exception e){
                MessageBox.Show("Файл не может быть прочитан.");
                MessageBox.Show(e.Message);
            }
            // Присваиваем к именам нумерацию
            string[] ArrayColumn = columnNames.Split(SEPARATOR);
            string[] ArrayNames = new string[ArrayColumn.Length - 1];
            for (int i = 1; i < ArrayColumn.Length; i++)
            {
                ArrayNames[i - 1] = i + ". " + ArrayColumn[i];
            }
            return ArrayNames;
        }
        //Считывание строк, позиции строк
        public void ReadCsvFileLines(){
            using (System.IO.StreamReader sr = new System.IO.StreamReader(fileName, Encoding.Default)){
                string line;
                int linesCounter = 0;
 
                while (!sr.EndOfStream){
                    line = sr.ReadLine();
                    linesCounter++;
                    //Строка содержит данные
                    if (Regex.IsMatch(line, @"\A\d{2}.\d{2}.\d{4}.*\Z", RegexOptions.IgnoreCase)){
                        
                        //Номер строки, с которой начинаются данные
                        firstLineWithData = linesCounter;
                        startPosition = sr.BaseStream.Position;
                        
                        //TODO:Получение даты и времени для AdcRate
                        //Время из первой строки данных
                        DateTime dt1 = DateTime.Parse(line.Split(SEPARATOR)[0]);
                        //Время из второй строки данных
                        line = sr.ReadLine();
                        linesCounter++;
                        DateTime dt2 = DateTime.Parse(line.Split(SEPARATOR)[0]);
                        //Вычисление adcRate: обратная величина количеству миллисекунд в разности времени
                        adcRate = 1000 / (float)(dt2 - dt1).TotalMilliseconds;
 
                        //Пока продолжаются строки с данными
                        do{
                            line = sr.ReadLine();
                            linesCounter++;//считаем строки
                        }
                        //while (!sr.EndOfStream && Regex.IsMatch(line, @"\A\d{2}.\d{2}.\d{4}.*\Z", RegexOptions.IgnoreCase));
                        while (!sr.EndOfStream && Regex.IsMatch(sr.ReadLine(), @"\A\d{2}.\d{2}.\d{4}.*\Z", RegexOptions.IgnoreCase));
                        { }
                       
                        //Номер строки, на которой данные заканчиваются
                        lastLineWithData = linesCounter;
                        //Позиция в потоке, на которой данные заканчиваются
                        endPosition = sr.BaseStream.Position;
                        return;
                    }
                }
            }
        }
[/SPOILER]
Так вот, нужно создать отдельный класс, для записи в .dat файл через BinaryWriter, но так чтобы записывались именно те столбцы и именно их строки, которые я выберу на форме, попытался сделать так, не получилось и встал на ровном месте, два дня уже себе голову ломаю, буду очень благодарен, если сможете чем-либо помочь.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
    static internal class DatFile
    {
        static private string filename;
        static private CSVProcess cp;
 
        //Создание файла, с присвоением формата dat
        public static CSVProcess Csv
        {
            get { return DatFile.cp; }
            set { DatFile.cp = value; }
        }
 
        static internal FileSaverExitCodesEnum WriteToDAT()
        {
            //Открываем dat-файл для записи
            using (BinaryWriter bw = new BinaryWriter(File.OpenWrite(GetDatFileFilename()), Encoding.ASCII))
            {
                //Открываем csv-файл для чтения
                using (StreamReader sr = new StreamReader(cp.FileName))
                {
                    string line;
                    //Чтение потока до первой строки с данными
                    sr.BaseStream.Position = cp.RowsCount;
 
                    while (!sr.EndOfStream && sr.BaseStream.Position != cp.RowsCount)
                    {
                        sr.BaseStream.Position = cp.RowsCount;
                        line = sr.ReadLine();
                        foreach (string item in line.Split(CSVProcess.SEPARATOR))
                        {
                            bw.Write(float.Parse(item));
                        }
                    }
                }
                return FileSaverExitCodesEnum.Done;
            }
        }
        static private string GetDatFileFilename()
        {
            return cp.FileName.Substring(0, cp.FileName.LastIndexOf('.')) + ".dat";
        }
    }
}
Добавлено через 6 часов 44 минуты
up!

Добавлено через 7 часов 40 минут
Никто не знает как это делается? Печально...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.10.2014, 21:40
Ответы с готовыми решениями:

Запись в текстовый файл через пробел
доброго времени суток уважаемые форумчане. у меня возник вопрос, как можно...

Локализовать приложение не через dll файл, а через обычный xml или ini файл
Добрый вечер дамы и господа, у меня возникла такой вопросик. Как можно...

Работа с потоками, ввод (использование BinaryReader/BinaryWriter)
Всем доброго времени суток. Дали прогу для зачёта в колледже. Сижу над ней 5...

Запись в файл
Хаи гайсы. У меня вот такая проблема эта часть кода копирует строки в нужный...

Запись в файл
Есть файл, допустим text.txt, в него программа должна записывать данные....

1
ked
1 / 1 / 0
Регистрация: 10.07.2014
Сообщений: 102
03.10.2014, 06:44  [ТС] 2
up!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.10.2014, 06:44

Запись в файл
Надо записать текст в файлы. Класс для записи: public class WriteFile ...

Запись в файл
Есть событие при котором в файл записываются данные из TextBox'a, как сделать...

Запись в файл
Как записать содержимое dataGridView в отдельный файл??


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru